Luis perez
Luis perez

Reputation: 132

update jtextpane with java swing

I'm making an application with java swing. In a button of the application I need to every x minutes to make something. I think that I must do it with a new thread, but I have two problems. The first is that I must to pass a parameter to these thread. I solved it with a class that extends of a Thread and a constructor. I think these way is correct no? The second thing I cannot resolve it is that I need to update a jtextpane while the thread is running but if I try to update the JTextPane propierties Eclipse says me that cannot be resolved. I think that the problem is that these thread is not the main thread. But... there is some way to fix it? Many thanks and sorry for my english!

The code is:

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");

            }
        });
    }


}

It says me lblNewLabel cannot be resolved.

Any help? Thanks

I'm trying with these code now and doesnt works:

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");

              }
          });

    }

}

Upvotes: 1

Views: 1063

Answers (2)

David Kroukamp
David Kroukamp

Reputation: 36423

  • You mention JTextPane in your question title but only refer to JLabel?

The main problem though you are having I see is that you have not declared the JLabel within the scope of your Thread, you could pass your JLabel instance which has a method to get a reference to the JLabel to your Thread via a constructor thus it has a reference to the JLabel, right now it doesnt.

  • Also I'd recommend using SwingUtilities and not EventQueue
  • And do not extend Thread class (unless adding custom functionality) rather implement a Runnable

Something like:

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();
        }
    }

Though depending on what you are doing a Swing Timer might be what you need, it will allow you to run code, at intervals/delays and all this is done on the EDT already.

Upvotes: 1

Audrius Meškauskas
Audrius Meškauskas

Reputation: 21748

Use Swing timer. It is very much like invisible button that is pressed periodically in the given intervals. It will call your actionPerformed already in a Swing thread from where you can manipulate components (same as from the JButton ActionListener). Hence most likely you do not need to run your own threads for this task.

Upvotes: 1

Related Questions