无法让更改侦听器与滑块一起使用

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);

问题是您有两个滑块,一个是实例变量,一个是局部变量。你把监听器添加到局部变量,但是你的监听器只能访问实例变量。

去掉局部变量。

其他问题:

  1. 不要在绘画方法中启动定时器。一种绘画方法只是为了绘画。定时器应该在构造函数中启动

  2. 应在所有组件都添加到面板后调用 setVisible( true )

  3. 您的 class 不应创建框架。您的自定义组件是一个独立的组件,在构造函数中创建框架与您的组件无关。该框架应在您用于测试代码的 public static void main() 方法中创建。