2016-09-14 156 views
-1

第一個代碼打印字符串mm更改時, 但當我刪除第二個代碼中顯示的第一個if語句時,我無法在它更改時打印m。 該程序的代碼如下。實施動作偵聽器接口

碼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關鍵字來保證變量更新能夠被其他線程看到。

static volatile String m = "bye";

一些事情最好是使用wait/notify線程通信

編輯:

原因第一代碼部分工作,因爲的println執行的原因。

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

當的println是this對象syncronised,它觸發主線程的之前發生關係。因爲讀取m的最新值。

您可以查看更Java Doc

Synchronizedvolatile結構形式的之前發生關係 寫的一個線程的結果保證是一個被另一個線程讀取可見只有在寫操作happens-在讀取操作之前。

+0

揮發性的東西實際上工作,所以謝謝ravthiru,但在我發佈它的第一個代碼工作,而不使用關鍵字「易變」可以幫助我理解爲什麼是這樣! –

+0

看到答案中的編輯,只是println內循環應該使第二部分也工作。 – ravthiru