Вызов фоновой нити в Swing - PullRequest
2 голосов
/ 07 ноября 2011

Первый код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class cos {
   public static int a;

   private static JLabel labeler;

   // public static Runnable r1;

   private JFrame frame;

   /**
    * Launch the application.
    */
   public static void main(String[] args) {
      a = 0;
      EventQueue.invokeLater(new Runnable() {
         public void run() {
            try {
               cos window = new cos();
               window.frame.setVisible(true);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      });

   }

   /**
    * Create the application.
    */
   public cos() {
      initialize();
   }

   /**
    * Initialize the contents of the frame.
    */
   public void initialize() {
      frame = new JFrame();
      frame.setBounds(100, 100, 205, 194);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      JLabel lblTime = new JLabel("Time:");
      frame.getContentPane().add(lblTime, BorderLayout.WEST);

      final JLabel labeler = new JLabel("");
      frame.getContentPane().add(labeler, BorderLayout.CENTER);

      JButton btnNewButton = new JButton("New button");
      btnNewButton.addActionListener(new ActionListener() {
         Runnable r1 = new Runnable() {
            public void run() {
               while (a <= 10) {
                  a = a + 1;
                  labeler.setText(Integer.toString(a));
                  try {
                     Thread.sleep(1000);
                  } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                  }
               }

            }
         };

         public void actionPerformed(ActionEvent arg0) {
            Thread threder = new Thread(r1);
            threder.start();
            // liczniczek bla = new liczniczek();

         }
      });
      frame.getContentPane().add(btnNewButton, BorderLayout.SOUTH);

   }

   public void licznik() {
      while (a < 60) {
         a = a + 1;
         labeler.setText(Integer.toString(a));
         try {
            Thread.sleep(1000);
         } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }
   }
}

А теперь мой вопрос.Я хочу использовать такой код:

             Runnable r1 = new Runnable(){
                public void run(){
                           licznik();

                }
            };

Но это не работает.Что я должен сделать, чтобы отделить этот код?Извините за мой плохой английский

Sierran.

Ответы [ 4 ]

3 голосов
/ 07 ноября 2011

никогда не используйте Thread#sleep(int) во время EDT, конечно, если есть только этот поток, то он работает правильно (с блокировкой EDT),

Runnable r1 = new Runnable(){
   public void run(){
       licznik();
   }
};

не так, как вы называете простой licznik();, вы должны обернуть это таким образом

Runnable r1 = new Runnable(){
   public void run(){
       labeler.setText(Integer.toString(a));    
   }
};

но опять без Thread#sleep(int), у вас есть три варианта

1) изменить Thread на javax.swing.Timer

2) измените Thread на Runnable#Thread, там вы можете отложить с помощью Thread#sleep(int), но вывод на GUI должен быть

Runnable r1 = new Runnable(){
   public void run(){
       labeler.setText(Integer.toString(a));    
   }
};

3) используйте SwingWorker , где вывод находится в EDT, и вы можете использовать Thread#sleep(int) тоже

пример Thread # sleep (int) во время EDT

собрать все вместе

EDIT

  • не используйте зарезервированные слова в качестве класса, метода, переменной или любого другого имени в языках программирования (что означает cos)

  • Ваш код работает, реализует все три опции, которые я публикую здесь,

2 голосов
/ 07 ноября 2011

Что значит "это не работает"?Меня устраивает.Как вы пытаетесь использовать этот код, и какие ошибки или проблемы возникают при его запуске?Я бы сам использовал SwingWorker и установил бы текст JLabel через пару методов публикации / процесса SwingWorker.Чтобы узнать больше о том, как использовать это, см. Этот учебник: Параллельность в Swing

Редактирование
На самом деле, более простой способ выполнить то, что вы хотите, этовообще не использовать потоки или Runnables напрямую, а использовать Swing Timer, так как они созданы именно для этого случая.Подробнее об этом читайте в учебнике Swing Timer

1 голос
/ 07 ноября 2011

Runnable интерфейс не имеет метода licznik (). Вы можете создать класс, который реализует Runnable с методом licznik ().

Или, если вам не нужно повторно использовать этот метод и использовать его только один раз, тогда самый быстрый способ - переместить его реализацию в новый блок Runnable ()

         Runnable r1 = new Runnable(){
            public void run(){
                       this.licznik();

            }
            public void licznik(){
                while (a < 60){
                a = a + 1 ;
                labeler.setText(Integer.toString(a));
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
        }
        }
        };
1 голос
/ 07 ноября 2011

Я понял, что вы хотите, чтобы функция licznik() запускалась в отдельном потоке. Вы создаете Runnable, но вам нужно сделать что-то еще, чтобы его метод run() выполнялся. Есть несколько способов сделать это:

Runnable r1 = new Runnable(){
    public void run(){
        licznik();
    }
};
new Thread(r1).start();

или вы можете просто создать подкласс Thread:

Thread r1 = new Thread(){
    public void run(){
        licznik();
    }
};
r1.start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...