Как динамически изменить размер прямоугольника снизу вверх. Джава - PullRequest
1 голос
/ 30 марта 2012

Итак, я пытаюсь создать апплет, который использует два JSliders для изменения размера прямоугольника.Мне бы хотелось, чтобы высота снизу вверх соответствовала внешнему виду вертикального JSlider.

Единственная проблема, с которой я сталкиваюсь, заключается в том, что рисование в Java происходит из x & y, которые оба расположены в 0, перемещаясь по x влево (на запад), а y направляется на юг.Изменить ширину очень просто, поскольку я использую метод с одним параметром для увеличения или уменьшения ширины.С высотой, двигаться вверх хорошо (у меня установлено значение 340, так как это база, на которой я бы хотел остановиться).Когда я перемещаю JSlider вниз, он опускается, но не достигает той высоты, на которой он был когда-то.Мне бы очень хотелось, чтобы это выглядело так, как будто прямоугольник движется так же, как движется JSlider.

Главная страница апплета (где расположены JSlider):

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class ResizeRectangle extends JApplet {
    private JSlider sliderHeight;
    private JSlider sliderWidth;
    private JLabel title;
    private Contents content;
    private int oldValue = 0;
    public void init(){

        setLayout(new BorderLayout());

        title = new JLabel("Rectangle Resizer");
        content = new Contents();

        content.setBackground(Color.WHITE);

        //Slider for increasing the height
        sliderHeight = new JSlider(SwingConstants.VERTICAL, 10, 100, 10);
        sliderHeight.setMajorTickSpacing(10);
        sliderHeight.setPaintTicks(true);

        sliderHeight.addChangeListener(
                new ChangeListener(){
                    public void stateChanged(ChangeEvent e){
                        //If sliderHeight is greater than oldValue pass true for increase
                        if(sliderHeight.getValue() > oldValue){
                            content.setHeight(sliderHeight.getValue(), true);
                        }
                        //Else if sliderHeight is less than oldValue pass false for increase
                        else if(sliderHeight.getValue() < oldValue){
                            content.setHeight(sliderHeight.getValue(), false);
                        }
                        //Sets the value of sliderHeight to the value of oldValue to compare later
                        oldValue = sliderHeight.getValue();
                    }
                }
        );
        //Slider for increasing the widht
        sliderWidth = new JSlider(SwingConstants.HORIZONTAL, 10, 100, 10);
        sliderWidth.setMajorTickSpacing(10);
        sliderWidth.setPaintTicks(true);

        sliderWidth.addChangeListener(
                new ChangeListener(){
                    public void stateChanged(ChangeEvent e){
                        content.setWidth(sliderWidth.getValue());
                    }
                }
        );

        content.setBackground(Color.WHITE);
        add(title, BorderLayout.NORTH);
        add(content, BorderLayout.CENTER);
        add(sliderWidth, BorderLayout.SOUTH);
        add(sliderHeight, BorderLayout.EAST);

    }
}

Этокод для установки высоты (а также ширины):

import java.awt.Component;
import java.awt.Graphics;



public class Contents extends Component {

    private int height = 10;
    private int width = 10;
    //Initialize y to 340.
    private int y = 340;

    //Draw the rectangle
    public void paint(Graphics g){
        g.fillRect(5, y, width, height);
    }

    public void setHeight(int h, boolean increase){
        //If the slider is increasing, decrease y and increase height to give it the
        // look of rising 
        if(increase){
            y = y - h;
            height = height + h;
        }
        //else do the opposite
        else{
            y = y + h;
            height = height - h;
        }
        //For debugging purposes
        System.out.println("h = "+h);
        System.out.println("y = "+y);
        System.out.println("height = "+height+"\n\n");
        //Repaint the rectangle
        repaint();

    }
    //Set the width and repaint
    public void setWidth(int w){
        width = w;
        repaint();
    }
}

Это мой третий месяц изучения Java, и я был бы очень признателен за любые отзывы.Заранее спасибо.

1 Ответ

1 голос
/ 30 марта 2012

У вас логическая проблема с вашим кодом. Вызов, используемый для изменения высоты внутри слушателя изменений, равен

content.setHeight(sliderHeight.getValue(), ...);

, что выглядит разумно с первого взгляда. Однако метод setHeight не делает то, что предлагает название (т.е. устанавливает высоту), а вместо этого увеличивает или уменьшает высоту на величину, указанную в качестве первого аргумента:

if(increase){
    y = y - h;
    height = height + h;
} else {
    y = y + h;
    height = height - h;
}

Таким образом, если ползунок изменяется с 10 на 20 и обратно на 10, вы получаете следующее изменение значений:

// initial values
y = 340
height = 10     

// change from 10 to 20, thus h=20 and increase as arguments for the method
y -> 340 - 20 = 320
height -> 10 + 20 = 30


// change from 20 back to 10, i.e. h=10 and decrease
y -> 320 + 10 = 330
height -> 30 - 10 = 20

Вместо этого метод должен установить высоту, т. Е.

y = 340 - h;
height = h;
...