实现Action Listener接口

时间:2016-09-14 02:04:50

标签: java swing

第一个代码在m更改时打印字符串m, 但当我删除第二个代码中显示的第一个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 :(得分:0)

您的应用程序涉及不同的线程,event dispatching thread其他线程main thread

actionPerformed在event dispatching thread

中执行

繁忙循环whilemain thread

中执行

一个线程所做的更改对其他线程不可见。您需要使用volatile关键字来保证其他线程可以看到变量更新。

static volatile String m = "bye";

这样的东西

建议使用wait/notify进行线程通信

编辑:

第一个代码部分工作的原因是因为println被执行了。

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

由于println在this对象上同步,它触发了主线程之前发生的关系。因为读取了m的最新值。

您可以在Java Doc

中查看更多内容

Synchronizedvolatile构造形式发生在之前的关系之前  只有在读取操作之前发生写入操作时,一个线程的写入结果才能保证对另一个线程的读取可见。