import java.awt.event.*; import java.awt.event.ActionListener; import java.awt.*; import javax.swing.*; public class Test extends JFrame implements ActionListener{ /** * */ private static final long serialVersionUID = 1L; JPanel p; JTextField field = new JTextField(); JButton button; JLabel label; Test frame ; //绘制界面 public void lunchFrame(){ frame = new Test(); button = new JButton("点击"); label = new JLabel(); Container content = this.getContentPane(); p = new JPanel(); p.setLayout(new BorderLayout()); content.add(p); p.add(field,BorderLayout.NORTH); p.add(label,BorderLayout.CENTER); p.add(button,BorderLayout.SOUTH); frame.setSize(100,200); frame.setTitle("title"); frame.setVisible(true); frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); button.addActionListener(frame); System.out.println("dddd"); } //构造方法 public Test(){ } //主函数 public static void main(String[] args){ Test test = new Test(); test.lunchFrame(); } //事件响应 @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().toString().equals("点击")){ if(field.getText().equals("")!=true){ label.setText("您输入的内容为\n:"+field.getText()); } } } }
上面的代码是创建一个窗体,有TextField,JButton,JLabel三个组件,当点击Button时将TextField中的内容显示在JLabel中。
如果你按上面的程序实现,你会发现根本行不通,下面是他的运行拷屏。(拷不上)
会发现他的界面并没有出现Button等之类的空间。
原因在于:仔细观察lunchFrame()方法中
frame = new Test();
这正是问题的所在,想一想如果写成frame = this;有会怎样的结果。答案是真确显示。
那为什么会出现上面的问题,就在于你在launchFrame()中frame = new Test();
同时在主函数中Test test = new Test();test.lunchFrame();注意test和frame是
两个不同的对象,所有的组件都添加在了frame身上而并非test身上,所以在你test.lunchFrame()
时,test中没有添加任何组件,所以就会出现上面的运行结果。
将上面lunchFrame()中
frame = new Test();改为
frame = this;
效果实现:。(拷不上)