无法让更改侦听器与滑块一起使用
Can't get change listener to work with slider
我应该制作一个屏幕保护应用程序,每五秒绘制一定数量的随机线条,我们应该包含一个 UI 以允许用户输入他们想要的线条数量画。我认为滑块最简单,但我无法让滑块更改绘制线条的循环中使用的 lines 变量的值。无论我将滑块放在哪里,该值都停留在 250
public class Q4 extends JComponent implements ActionListener, ChangeListener{
private Random rand=new Random();
private Timer time=new Timer(5000,this);
private int lines;
JSlider line=new JSlider(0,500);;
public Q4(){
JFrame frame=new JFrame();
frame.setSize(1080,720);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(this);
JSlider line=new JSlider(0,500);
line.addChangeListener(this);
line.setMajorTickSpacing(50);
line.setMinorTickSpacing(25);
line.setPaintTicks(true);
line.setPaintLabels(true);
frame.add(line, BorderLayout.NORTH);
}
@Override
public void paintComponent(Graphics g) {
time.start();
int x=0;
while(x<lines) {
int x1=rand.nextInt(getWidth())+1;
int y1=rand.nextInt(getHeight())+1;
int x2=rand.nextInt(getWidth())+1;
int y2=rand.nextInt(getHeight())+1;
g.drawLine(x1, y1, x2, y2);
x++;
}
System.out.println(lines);
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
@Override
public void stateChanged(ChangeEvent e) {
lines=line.getValue();
}
private int lines;
JSlider line=new JSlider(0,500);;
public Q4(){
...
JSlider line=new JSlider(0,500);
问题是您有两个滑块,一个是实例变量,一个是局部变量。你把监听器添加到局部变量,但是你的监听器只能访问实例变量。
去掉局部变量。
其他问题:
不要在绘画方法中启动定时器。一种绘画方法只是为了绘画。定时器应该在构造函数中启动
应在所有组件都添加到面板后调用 setVisible( true )
您的 class 不应创建框架。您的自定义组件是一个独立的组件,在构造函数中创建框架与您的组件无关。该框架应在您用于测试代码的 public static void main()
方法中创建。
我应该制作一个屏幕保护应用程序,每五秒绘制一定数量的随机线条,我们应该包含一个 UI 以允许用户输入他们想要的线条数量画。我认为滑块最简单,但我无法让滑块更改绘制线条的循环中使用的 lines 变量的值。无论我将滑块放在哪里,该值都停留在 250
public class Q4 extends JComponent implements ActionListener, ChangeListener{
private Random rand=new Random();
private Timer time=new Timer(5000,this);
private int lines;
JSlider line=new JSlider(0,500);;
public Q4(){
JFrame frame=new JFrame();
frame.setSize(1080,720);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(this);
JSlider line=new JSlider(0,500);
line.addChangeListener(this);
line.setMajorTickSpacing(50);
line.setMinorTickSpacing(25);
line.setPaintTicks(true);
line.setPaintLabels(true);
frame.add(line, BorderLayout.NORTH);
}
@Override
public void paintComponent(Graphics g) {
time.start();
int x=0;
while(x<lines) {
int x1=rand.nextInt(getWidth())+1;
int y1=rand.nextInt(getHeight())+1;
int x2=rand.nextInt(getWidth())+1;
int y2=rand.nextInt(getHeight())+1;
g.drawLine(x1, y1, x2, y2);
x++;
}
System.out.println(lines);
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
@Override
public void stateChanged(ChangeEvent e) {
lines=line.getValue();
}
private int lines;
JSlider line=new JSlider(0,500);;
public Q4(){
...
JSlider line=new JSlider(0,500);
问题是您有两个滑块,一个是实例变量,一个是局部变量。你把监听器添加到局部变量,但是你的监听器只能访问实例变量。
去掉局部变量。
其他问题:
不要在绘画方法中启动定时器。一种绘画方法只是为了绘画。定时器应该在构造函数中启动
应在所有组件都添加到面板后调用 setVisible( true )
您的 class 不应创建框架。您的自定义组件是一个独立的组件,在构造函数中创建框架与您的组件无关。该框架应在您用于测试代码的
public static void main()
方法中创建。