2016-03-29 9 views
0

私は、Runnableインターフェイスを実装するJPanelJFrameに割り当てようとしています。私はこの考え方を解釈するためのサンプルを作りました。私は新しいインスタンスのパラメータとしてStringのウィンドウにデモとしてテキストを表示するマルチスレッドパネルを追加したいと思います。私はRunnableインターフェイスを実装したので、パネルは独立したプロセスを持つ必要があります。しかし、クラスの新しいインスタンスを持つ新しいインスタンスのパネルを作成しようとすると、動作しません。マルチスレッド拡張パネル

私は間違っていますか?

imagePanel Panelクラス:

メインクラステストクラス
public class imagePanel extends JPanel implements Runnable{ 
    JLabel imageTest; 

    public imagePanel(String textLabel) 
    { 
     this.setPreferredSize(new Dimension(300,300)); 
     imageTest = new JLabel(textLabel); 
     imageTest.setPreferredSize(this.getPreferredSize()); 
    } 

    public void setImageText(String newText){ 
     imageTest.setText(newText); 
    } 

    public void run(){ 
     this.add(imageTest); 
    } 

} 

public class test { 
    public static void main(){ 
     JFrame frame = new JFrame("Test Window"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(300,300));    

     JPanel panel = new imagePanel("Text label"); 
     panel.setPreferredSize(frame.getPreferredSize()); 

     frame.add(panel); 
     frame.setVisible(true); 
    } 
} 
+1

:あなたが欠場すると、あなたの「実行」メソッドを実行するためのエントリポイントです。 Panelはユーザーインターフェイスコンポーネントです。スレッドでは何もしないでください。また、あなたのコードで 'run()'は決して呼び出されないので、それも "壊れています"。 – Kayaman

+0

あなたのパネルにラベルを追加するのを忘れた –

+0

@SergiyMedvynskyy実際のコードのある時点で 'panel'のインスタンスをラップする' Thread'を作成したと仮定すると、 、 'this.add(imageTest);'が呼び出されるはずですが、それは "if"の多くです。 – MadProgrammer

答えて

2
  1. スイングUIへの更新を意味し、スレッドセーフではありませんが、唯一のコンテキスト内からなされるべきですイベントディスパッチスレッド。詳細はConcurrency in Swing、可能な解はを参照してください。
  2. スイングレイアウトは怠惰ですが、あなたに伝えるまでアップデートされません。サイズ変更)。あなたは魔法のよう
を管理するためのプログラムはかなり困難になるだろうこと、あなたが持つかもしれないすべてのインスタンスに接続していないあなたは、クラスの新しいインスタンスを作成する
  • を更新しているコンテナにrevalidaterepaintを呼び出すことにより、更新をトリガすることができます

    非常に重要が欠落し

  • 1

    がいくつかのこと - あなたはAWTのEventDispatcherスレッド以外のUIを更新してはいけません。 Swingを使用すると、デッドロックが発生することさえあります。 this post

    Swing UIコンポーネントを更新するには、SwingUtilitiesを使用する必要があります。

    SwingUtilities.invokeLater(new Runnable(){ 
        public void run(){ 
         // update your UI components 
        } 
    }); 
    

    次の情報 - マルチスレッドスレッドの作成方法は?それは、「マルチスレッドパネル」を作成することは非常にきれいではありません

    public class MyMultiThreadedType implements Runnable { 
        public void run() { 
         // this will run in parallel 
        } 
    
        public static void main(String[] args) { 
        MyMultiThreadedType mmt = new MyMultiThreadedType(); 
        Thread t = new Thread(mmt); 
        t.start(); // this will start a parallel thread 
        } 
    } 
    
    関連する問題