java.awt.event.MouseAdapter с циклом так медленно

Я разрабатываю программу с использованием JFrame и хочу понять, что когда вы нажимаете кнопку, должен работать цикл в другом классе. Он работает, но так медленно. За одну секунду вы можете увидеть только одну итерацию цикла. Я не понимаю, почему. Есть фрагменты кодов, которые вам нужно знать. Звонящий слушатель:

playWithComputerButton.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            startLoop(1);
        }
    });

называется кусок:

if(gameMode == 2){
        int i = 0;
        while(i < 500){
            int pos = ((Computer) playerA).thinkIt(board.getBoard());
            display("bu pas : " + pos);
            i++;
        }

Нет проблем с итерацией и вызовом слушателя. (я пробовал это также с другими итерациями и «ActionListener», но результат тот же.

Что может быть решением?


person AsqaN    schedule 14.12.2012    source источник
comment
Вам нужно использовать SwingWorker для выполнения длинных операций, не связанных с графическим интерфейсом.   -  person Nikolay Kuznetsov    schedule 14.12.2012
comment
Я бы посоветовал быстро прочитать этот ответ, хотя это не прямой ответ, он выделит проблемы, с которыми вы сталкиваетесь, и почему ответ Николая на самом деле правильный   -  person MadProgrammer    schedule 14.12.2012
comment
Есть фрагменты кода, которые вам необходимо знать. Вместо фрагментов отредактируйте свой вопрос, включив в него sscce который фокусируется на проблеме. Несколько примеров приведены здесь.   -  person trashgod    schedule 14.12.2012
comment
это было именно то, что я искал. Теперь работает без задержек! Спасибо Николай и Madprogrammer. @trashgod, спасибо за ваш отзыв. я сделаю это.   -  person AsqaN    schedule 14.12.2012


Ответы (1)


Для выполнения длительных операций, не связанных с графическим интерфейсом, мы можем просто использовать javax.swing.SwingWorker, как объяснили Николай Кузнецов и MadProgrammer выше.

Вот пример того, как его использовать: пример и вот javadoc SwingWorker: javadoc

в случае моей программы решение:

Сначала создайте новый расширяющий класс SwingWorker в своем классе JFrame.

class LoopWorker extends SwingWorker<Integer, Integer>
{
    protected Integer doInBackground() throws Exception
    {
        // perform your loop
    }

    protected void done()
    {
        // what has to be done after performing
    }
}

Затем кнопка должна вызывать свой метод execute следующим образом:

learnButton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent evt) {
            new LoopWorker().execute();
        }
     });
person AsqaN    schedule 15.12.2012