Не удается изменить слушателя для работы с ползунком - PullRequest
0 голосов
/ 15 ноября 2018

Я должен был создать приложение-заставку, которое рисует определенное количество случайных линий каждые пять секунд, и мы должны были включить пользовательский интерфейс, чтобы позволить пользователю вводить количество линий, которые они хотят нарисовать. Я подумал, что ползунок будет проще, но я не могу заставить ползунок изменить значение переменной 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();  
}

1 Ответ

0 голосов
/ 15 ноября 2018
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(), который вы используете для проверки кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...