无法使更改侦听器与滑块配合使用

时间:2018-11-15 16:44:13

标签: java graphics slider changelistener

我应该制作一个屏幕保护程序应用程序,该应用程序每五秒钟绘制一定数量的随机线条,并且我们应该包含一个UI,以允许用户输入他们想要绘制的线条数量。我认为滑块是最简单的,但是我无法让滑块更改在绘制线条的循环中使用的lines变量的值。无论我把滑块放在哪里

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

1 个答案:

答案 0 :(得分:0)

private int lines;
JSlider line=new JSlider(0,500);;
public Q4(){
    ...
    JSlider line=new JSlider(0,500);

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

摆脱局部变量。

其他问题:

  1. 不要在绘画方法中启动计时器。绘画方法仅用于绘画。计时器应该在构造函数中启动

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

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