1

Java swing でアプリケーションを作っています。アプリケーションのボタンで、x 分ごとに何かを作成する必要があります。新しいスレッドでやらないといけないと思っているのですが、2点問題があります。1 つ目は、これらのスレッドにパラメーターを渡す必要があることです。Thread とコンストラクターを拡張するクラスで解決しました。これらの方法は正しいと思いますか?解決できない2番目のことは、スレッドの実行中に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");

              }
          });

    }

}
4

2 に答える 2

1
  • JTextPane質問のタイトルで言及していますが、参照しているのはJLabel

JLabel私が見ている主な問題は、スレッドのスコープ内で宣言していないことです。コンストラクターを介してスレッドへJLabelの参照を取得するメソッドを持つインスタンスを渡すことができるため、 JLabelJLabel今はそうではありません。

  • SwingUtilitiesまた、使用することをお勧めしますEventQueue
  • そして、クラスを拡張しないでください(カスタム機能を追加しThreadない限り)implementRunnable

何かのようなもの:

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ですでに実行されています。

于 2012-11-20T16:29:23.997 に答える
1

スイングタイマーを使用します。これは、指定された間隔で定期的に押される見えないボタンに非常によく似ています。コンポーネントを操作できる場所から、すでに Swing スレッドにあるものを呼び出しますactionPerformed(からと同じJButton ActionListener)。したがって、ほとんどの場合、このタスクのために独自のスレッドを実行する必要はありません。

于 2012-11-20T15:59:03.970 に答える