Отрегулируйте размеры фигуры с помощью JScrollBar
Я хочу иметь возможность изменять позиции и / или размеры формы с помощью JScrollBar. Я все еще довольно плохо знаком с компонентами качания, но выяснил, как изменить положение строки, но я не знаю, как это сделать с помощью фигуры, нарисованной из paintComponent. У меня есть это как мой слушатель настройки:
scrollBar.addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
double value = scrollBar.getValue(); //returns current value of scrollbar 0-100
double maximumValue = scrollBar.getMaximum();
double newX = (value * messagePanel.getWidth() / maximumValue);
messagePanel.setXCoordinate((int)newX);
}//end adjustment Value Changed
});//end adjustment listener
координаты x и y для сообщения по умолчанию равны 20, но я не уверен, как настроить все это для эллипса или прямоугольника (оба 2D). Я не знаю, есть ли какой-то другой алгоритм или как это сделать. Я могу предоставить больше кода, если это необходимо. Пожалуйста помоги!
Код тестирования JSlider:
public class event implements ChangeListener{
public void stateChanged(ChangeEvent e) {
int value = slider.getValue();
label.setText("Current Value " + value);
circle.setWidth(value);
}//end stateChanged
}//end class event
И у меня есть форма, нарисованная здесь:
private Shape circle;
int width = 300;
public DrawShape() {
this.circle = new Ellipse2D.Float(100, 20, width, 300);
}
public void setWidth(int width) {
this.width = width;
}
Значение изменяется, но оно не меняет переменную width, где я ошибаюсь?
1 ответ
Поэтому я тестирую JSlider, но по какой-то причине не могу заставить его реально изменить ширину.
Я не вижу, чтобы вы вызывали метод repaint() после изменения ширины круга. Попробуйте этот рабочий пример в качестве отправной точки и внимательно прочитайте учебник Выполнение пользовательской живописи.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Demo {
private Shape circle;
private int width = 100;
private int height = 100;
private void initGUI(){
final JPanel drawPane = new JPanel(){
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
circle = new Ellipse2D.Float(100, 20, width, height);
Graphics2D graphics = (Graphics2D)g.create();
graphics.draw(circle);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400,300);
}
};
JSlider widthSlider = new JSlider(width, width * 2, width);
widthSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider slider = (JSlider)e.getSource();
width = slider.getValue();
drawPane.repaint();
}
});
JSlider heightSlider = new JSlider(height, height * 2, height);
heightSlider.setOrientation(JSlider.VERTICAL);
heightSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider slider = (JSlider)e.getSource();
height = slider.getValue();
drawPane.repaint();
}
});
JPanel content = new JPanel(new BorderLayout());
content.add(widthSlider, BorderLayout.NORTH);
content.add(drawPane, BorderLayout.CENTER);
content.add(heightSlider, BorderLayout.WEST);
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setContentPane(content);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().initGUI();
}
});
}
}