2016-09-14 14 views
-1

mmの場合、 の場合、最初のコードは文字列mを出力しますが、2番目のコードに示す最初のif文を削除すると、 プログラムのコードを以下に示します。アクションリスナーインターフェイスを実装しています

コード1

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
    class firstgui extends JFrame implements ActionListener{ 
     private JTextArea textarea; 
     private JTextField textfield; 

     static String m="bye"; 

firstgui() { 
    setLayout(new FlowLayout()); 
    textfield = new JTextField(20); 
    add(textfield); 
    textarea = new JTextArea(5,20); 
    add(textarea); 
    textfield.addActionListener(this);   
} 
public void actionPerformed(ActionEvent e) 
{ 
    String text= textfield.getText(); 
    m=text; 
    textarea.append("aman: " + text + "\n"); 
    textfield.setText(""); 
} 

public static void main(String args[]) 
{ int t=0; 
    firstgui a = new firstgui(); 
    a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    a.setVisible(true); 
    a.setTitle("gui"); 
    a.pack(); 
    while(true) 
    { 
     if(m.equals("bye")) 
     { 
      System.out.println(m); 
     } 
     if(!(m.equals("bye"))) 
      System.out.println(m); 
    }  
    } 
} 

コード2

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
     class firstgui extends JFrame implements ActionListener{ 
    private JTextArea textarea; 
    private JTextField textfield; 

    static String m="bye"; 

    firstgui() { 
    setLayout(new FlowLayout()); 
    textfield = new JTextField(20); 
    add(textfield); 
    textarea = new JTextArea(5,20); 
    add(textarea); 
    textfield.addActionListener(this);   
} 

public void actionPerformed(ActionEvent e) 
{ 
    String text= textfield.getText(); 
    m=text; 
    textarea.append("aman: " + text + "\n"); 
    textfield.setText(""); 
} 

    public static void main(String args[]) 
{ int t=0; 
    firstgui a = new firstgui(); 
    a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    a.setVisible(true); 
    a.setTitle("gui"); 
    a.pack(); 
    while(true) 
    {    
     if(!(m.equals("bye"))) 
     System.out.println(m); 
    }  
    } 
} 
+1

実際に質問がありますか? –

+0

あなたの質問の読者にあなたのコードの実際の結果と期待される結果は何かを明確にすべきです。 – gus27

答えて

0

一方が他方event dispatching threadあるアプリケーションに関わるさまざまなスレッドがありmain threadされます。

のactionPerformedをevent dispatching thread

ビジーループwhileで実行されるが、他のスレッドに表示されていない一つのスレッドによって行わmain thread

変更して実行されます。変数の更新を他のスレッドが見ることができるようにするには、volatileキーワードを使用する必要があります。 printlnを実行してしまったので、最初のコード部分が働い

理由:

いくつかのことstatic volatile String m = "bye";

のようにスレッド間通信

EDITためwait/notifyを使用することをお勧めします。

if(m.equals("bye")) 
{ 
    System.out.println(m); 
} 

のprintlnをthisオブジェクトにsyncronisedされるように、それはメインスレッドの事前発生関係を引き起こし。 mの最新の値が読み取られるからです。

あなたはより多くのを確認することができJava Doc

Synchronizedvolatile構造形式は事前発生関係にあるスレッドによる書き込みの 結果はライト動作のみならば、別のスレッドによって読み取らに見えることが保証されていhappens-読み出し動作の前に。

+0

揮発性のものが実際に働いてくれてありがとうravthiruしかし、最初のコードでは、 "volatile"というキーワードを使わずに作業していたので、なぜそれが分かるのか理解できます! –

+0

答えの編集を参照してください。ちょうどprintln insideループは2番目の部分も動作させるべきです。 – ravthiru

関連する問題