2012-11-20 52 views
1

我用java swing制作应用程序。在应用程序的按钮中,我需要每x分钟做一些事情。 我认为我必须用新线程来做,但我有两个问题。首先是我必须将参数传递给这些线程。我用一个扩展了Thread和构造函数的类来解决它。我认为这种方式是正确的吗? 我无法解决的第二件事是,我需要在线程运行时更新jtextpane,但如果我尝试更新JTextPane propierties,Eclipse说我无法解析。我认为问题在于这些线程不是主线程。但是......有一些方法可以解决它? 非常感谢和抱歉我的英语!用java swing更新jtextpane

的代码是:

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

       } 
      }); 

    } 

} 
+1

最好发布一个你已经尝试过的小例子。见http://sscce.org/ 另外,看看http://docs.oracle。com/javase/tutorial/uiswing/concurrency/dispatch.html,因为这可能会回答有关在Swing UI中进行线程处理的大部分问题。 –

+0

我使用代码编辑问题。 T – user650034

回答

1

使用Swing timer。它非常像在给定的时间间隔内按下不可见的按钮。它会调用您的actionPerformed已经在一个Swing线程中,您可以在其中操作组件(与JButtonActionListener相同)。因此,您很可能不需要为此任务运行自己的线程。

1
  • 您在问题标题中提及JTextPane,但仅提及JLabel

虽然你有我看到的主要问题是,你还没有宣布JLabel您的线程的范围内,你可以通过它有一个方法来获得你的线程的JLabel参考您的JLabel实例通过一个构造函数,因此它有一个对JLabel的引用,现在它没有。

  • 另外我推荐使用SwingUtilities而不是EventQueue
  • ,且都没有Thread类(除非添加自定义的功能),而implement一个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。

+0

@Daniweb谢谢大卫。我如何看待你是一位专家。我希望你回答我这些问题。为什么如果我编写这些代码,JLabel donest会放置代码的文本?我在第一个问题中编写代码,在buttom上。 – user650034

+0

@ user650034请参阅更新 –