Почему MouseListener не работает во время работы цикла? - PullRequest
0 голосов
/ 29 марта 2019

Я создаю Java-программу и хочу приостановить ее, пока не будет определен щелчок мыши с помощью MouseListener.Как бы я «приостановил» программу, например, используя цикл, таким образом, чтобы MouseListener все еще работал, и программа могла вернуться к тому же методу?

Я попытался поставить цикл, чтобы остановить программудо тех пор, пока переменная не станет true, но MouseListener не сможет работать, если цикл запущен.

Я также пытался поместить оставшуюся часть кода в метод mouseClicked или запускать новые методы из mouseClicked, однако другая ошибкапроизошло потому, что я не могу использовать Graphics g нигде, кроме paintComponent, поэтому мне кажется, что для приостановки программы необходим цикл.

Вот упрощенная программа, которую я создал, чтобы показать суть проблемы,(Не полный код).

class Surface extends JPanel implements MouseListener{
    @Override
    public void mouseClicked(MouseEvent arg0) { 
        //Some way to unpause program
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawLine(30, 30, 200, 30);
        //The program needs to 'pause' here until a click is identified.
        System.out.println("Program finishes here");
    }    
}

MouseListener работает, однако кажется, что он работает, только если программа неактивна и завершила весь код в paintComponent.

Вот код, который не работает, поскольку цикл работает.

class Surface extends JPanel implements MouseListener{
    public static boolean repeatLoop = true;

    @Override
    public void mouseClicked(MouseEvent arg0) { 
        repeatLoop = false;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawLine(30, 30, 200, 30);

        while (repeatLoop) {

        }

        System.out.println("Program finishes here");
    }    
}

Я ожидал, что цикл, сообщающий потоку о спящем режиме, может также работать, но это имеет тот же результати MouseListener не может быть вызван.

Поэтому я спрашиваю, почему MouseListener не может функционировать во время выполнения цикла, и есть ли простой способ предотвратить эту проблему и приостановить программу, пока не будет запущен код mouseClicked.

1 Ответ

1 голос
/ 29 марта 2019

Ваш цикл в paintComponent блокирует основной поток, поэтому это не сработает.Вы не должны помещать такую ​​логику в paintComponent.Лучшее, что вы можете сделать, это создать отдельный поток, который проверяет повторение цикла.Если переменная reapetLoop становится ложной, вы можете завершить приложение.

Метод paintComponent предназначен только для рисования на JPanel.

...