обновить jtextpane с помощью Java Swing

Я делаю приложение с java Swing. В кнопке приложения мне нужно каждые x минут что-то делать. Я думаю, что я должен сделать это с новой нитью, но у меня есть две проблемы. Во-первых, я должен передать параметр в этот поток. Я решил это с помощью класса, который расширяет поток и конструктор. Я думаю, что этот путь правильный нет? Второе, что я не могу решить, это то, что мне нужно обновить jtextpane во время работы потока, но если я попытаюсь обновить свойства JTextPane, Eclipse скажет мне, что это невозможно решить. Я думаю, что проблема в том, что эти потоки не являются основными потоками. Но... есть способ это исправить? Большое спасибо и извините за мой английский!

Код:

btnIniciar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                //String file = "D:\\prueba.torrent";

        //  while (true) {
                Hilo ejecutar = new Hilo(listaBuscar);

                ejecutar.run();



public class Hilo extends Thread {



    public Hilo(List<String> aBuscar){            
    }
    public void run(){
        System.out.println("Trabajo por hacer dentro de MiHilo");
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
               lblNewLabel.setText("hola");

            }
        });
    }


}

Он говорит мне, что lblNewLabel не может быть разрешен.

Любая помощь? Спасибо

Я пытаюсь использовать этот код сейчас и не работает:

public class Hilo implements Runnable {

    private JLabel etiqueta;

    public Hilo (List <String> aBuscar, JLabel label){

        System.out.println("Hemos entrado en el puto hilo");
        etiqueta = label;


    }
    @Override
    public void run() {

          etiqueta.setText("hola");
          System.out.println("vamos a coneseguirlo");

        // TODO Auto-generated method stub
          SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                 etiqueta.setText("hola");
                 System.out.println("vamos a coneseguirlo");

              }
          });

    }

}

person Luis perez    schedule 20.11.2012    source источник
comment
Было бы лучше опубликовать небольшой пример того, что вы пробовали. См. sscce.org Также обратите внимание на docs.oracle.com/javase/tutorial/uiswing/concurrency/, так как это может ответить на большинство ваших вопросов о многопоточности в Swing. Пользовательский интерфейс.   -  person Hermann Hans    schedule 20.11.2012
comment
Я редактирую вопрос с кодом. Т   -  person Luis perez    schedule 20.11.2012


Ответы (2)


Используйте таймер Swing. Это очень похоже на невидимую кнопку, которую периодически нажимают через заданные промежутки времени. Он вызовет ваш actionPerformed уже в потоке Swing, откуда вы можете манипулировать компонентами (так же, как из JButton ActionListener). Следовательно, скорее всего, вам не нужно запускать собственные потоки для этой задачи.

person Audrius Meskauskas    schedule 20.11.2012

  • Вы упоминаете JTextPane в заголовке своего вопроса, но ссылаетесь только на JLabel?

Основная проблема, с которой вы столкнулись, я вижу, заключается в том, что вы не объявили JLabel в рамках своего потока, вы можете передать свой экземпляр JLabel, у которого есть метод для получения ссылки на JLabel в ваш поток через конструктор, поэтому он имеет ссылка на JLabel, сейчас ее нет.

  • Также я бы рекомендовал использовать SwingUtilities, а не EventQueue
  • И не расширяйте класс Thread (если не добавлять пользовательские функции), а implement a Runnable

Что-то типа:

GUI.java:

    public class GUI {

        private JFrame frame;
        private JLabel label;
        private JButton btnIniciar;

       public void getJLabel() {
           return label;
       }

        public void initComponents() {
        //create UI and components here

        btnIniciar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                //String file = "D:\\prueba.torrent";
                Hilo ejecutar = new Hilo(listaBuscar,Gui.this);//pass reference of to our class

          }
      }

    }

Hilo.java:

    public class Hilo implements Runnable {

        private Thread t;
        private final GUI gui;

        public Hilo(List<String> aBuscar, GUI ui){      
             this.gui=ui;   
             t=new Thread(this);   
              startThread();
        }

        @Override
        public void run(){
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                   gui.getJLabel().setText("hola");
                }
            });
        }
        //so we can start thread from other class
        public void startThread() {
           if(!t.isAlive()) //if the thread is not started alreade
           t.start();
        }
    }

Хотя в зависимости от того, что вы делаете, Swing Timer может вам нужно, это позволит вам запускать код с интервалами/задержками, и все это уже делается на EDT.

person David Kroukamp    schedule 20.11.2012
comment
@Daniweb Спасибо, Дэвид. Как я вижу, вы эксперт. Я надеюсь, что вы ответите мне на эти вопросы. Почему, если я напишу этот код, JLabel не поместит текст кода? Я пишу код в первом вопросе, внизу. - person Luis perez; 21.11.2012