import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;public class SwingTest {
public static void main(String[] args) {
CFrame frame = new CFrame();
}
}class CFrame extends JFrame{
CPanelUp panelUp = new CPanelUp();   // 上面显示的结果文本框面板.
CPaneDown panelDown = new CPaneDown();  // 下面显示的计算器的按钮面板.

CFrame(){  // JFrame默认的边框布局.
this.add(panelUp,BorderLayout.NORTH);  
this.add(panelDown,BorderLayout.CENTER);
this.setSize(220,280);
this.setLocation(100,100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}class CPanelUp extends JPanel{
TextField resultText = new TextField(20);

CPanelUp(){
this.setBackground(Color.RED);
this.add(resultText); }

class Event implements ActionListener{
public void actionPerformed(ActionEvent e) {
JButton clicked = (JButton)e.getSource();

resultText.setText(clicked.getText());  // 这里为什么不能设置文本框的值.
 
System.out.println(clicked.getText());  // 而在这里却可以发现按钮确实单击了.

System.out.println(resultText.getText()); // 文本框的值也可以get出来.
}

}
}class CPaneDown extends JPanel{
JButton button = new JButton("按钮");

CPaneDown(){
this.add(button);
CPanelUp tt = new CPanelUp();

button.addActionListener(tt.new Event());
}
}

解决方案 »

  1.   

    你确定不行?
    输出结果:
    按钮
    按钮
    代码中这两句要这么写:
        this.getContentPane().add(panelUp, BorderLayout.NORTH);
        this.getContentPane().add(panelDown, BorderLayout.CENTER);
      

  2.   

    不好意思,没看清楚楼主的意思
    用了两个面板的确是不行
    面板刷新的问题吧
    把按钮和文本框放在同一个panel里就行了
      

  3.   

    class CPaneDown extends JPanel{
    JButton button = new JButton("按钮");CPaneDown(){
    this.add(button);
    CPanelUp tt = new CPanelUp();button.addActionListener(tt.new Event());
    }
    }
    实际上,在CPanelUp tt = new CPanelUp();这里又重新生成了一个CPanelUp对象,
    而这一个对象并不是在Frame中产生的,所以在Frame中的CpanelUp中的Text是不
    会发生改变的。