初学JAVA,在做一个反射的练习,但是老是得不到输入的内容,按下按钮后,得到的总是初始值,而且内容也会返回到初始状态,就像重置了一样。代码如下:public class Ex02 extends JFrame {
private static final long serialVersionUID=20101008L;
private int screenWidth=Toolkit.getDefaultToolkit().getScreenSize().width;
private int screenHeight=Toolkit.getDefaultToolkit().getScreenSize().height;
private JPanel pane=null;
private JLabel usernameLabel=null;
private JTextField username=null;
private JLabel sexLabel=null;
private JPanel sex=null;
private ButtonGroup sexGroup=new ButtonGroup();
private JRadioButton man=new JRadioButton("男");
private JRadioButton woman=new JRadioButton("女");
……
private JButton submit=null;
public Ex02() {
initialize();
}
private void initialize() {
Container container=this.getContentPane();
this.setTitle("用户信息");
this.setSize(280, 220);
this.setLocation((screenWidth-280)/2, (screenHeight-220)/2);
container.setLayout(new FlowLayout());
container.add(getPane());
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private JPanel getPane() {
if (pane==null) {
pane=new JPanel(new GridBagLayout());
GridBagConstraints gridBagConstraints=new GridBagConstraints();
gridBagConstraints.anchor=GridBagConstraints.WEST;
gridBagConstraints.gridx=0;
gridBagConstraints.gridy=0;
pane.add(getUsernameLabel(),gridBagConstraints);
gridBagConstraints.gridx=1;
gridBagConstraints.gridy=0;
pane.add(getUsername(), gridBagConstraints);
gridBagConstraints.gridx=0;
gridBagConstraints.gridy=1;
pane.add(getSexLabel(), gridBagConstraints);
gridBagConstraints.gridx=1;
gridBagConstraints.gridy=1;
pane.add(getSex(), gridBagConstraints);
……
gridBagConstraints.gridx=1;
gridBagConstraints.gridy=5;
pane.add(getSubmit(), gridBagConstraints);
}
return pane;
}
private JLabel getUsernameLabel() {
if (usernameLabel==null) {
usernameLabel=new JLabel("姓名:");
}
return usernameLabel;
}
private JTextField getUsername() {
if (username==null) {
username=new JTextField(10);
}
return username;
}
private JLabel getSexLabel() {
if (sexLabel==null) {
sexLabel=new JLabel("性别:");
}
return sexLabel;
}
private JPanel getSex() {
if (sex==null) {
sex=new JPanel(new FlowLayout());
sexGroup.add(man);
sexGroup.add(woman);
sex.add(man);
sex.add(woman);
}
return sex;
}
……
//按钮监听事件,按下按钮如果无输入信息,则弹出提示对话框
//现在的问题是,按下按钮后得到的是初始值,得不到输入信息,所以后面的那个if就一直成立,即使输入了信息,也会弹出对话框,望高手指教
private JButton getSubmit() {
if (submit==null) {
submit=new JButton("确定");
submit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg) {
Ex02 ex=new Ex02();
Class<? extends Ex02> ex02C=ex.getClass();
try {
Field usernameField=ex02C.getDeclaredField("username");
usernameField.setAccessible(true);
JTextField username=(JTextField)usernameField.get(ex); Field sexGroupField=ex02C.getDeclaredField("sexGroup");
sexGroupField.setAccessible(true);
ButtonGroup sexGroup=(ButtonGroup)sexGroupField.get(ex);
JTextField id=(JTextField)idField.get(ex);
……
if (username.getText().trim().length()==0) {
JOptionPane.showMessageDialog(null, "请输入姓名", "友情提示", JOptionPane.INFORMATION_MESSAGE);
username.requestFocusInWindow();
} else if (!sexGroup.isSelected(ex.man.getModel()) && !sexGroup.isSelected(ex.woman.getModel())) {
JOptionPane.showMessageDialog(null, "请选择性别", "友情提示", JOptionPane.INFORMATION_MESSAGE);
ex.man.requestFocusInWindow();
}
} catch (Exception err) {
err.printStackTrace();
}
}
});
}
return submit;
}
public static void main(String[] args) {
new Ex02();
}
}

解决方案 »

  1.   

    原因很简单,你main方法里面有一个new Ex02(),getSubmit()方法里面有一个Ex02 ex=new Ex02(),它们不是同一个Ex02对象,显示出来的是main方法里面的Ex02对象,而你要获取属性的是getSubmit()方法里面实例化的Ex02对象。比较奇怪的是,你居然没有陷入无限递归,因为你构造方法没有执行完又实例化了一个对象。
      

  2.   

    static Ex02 ex;
    public static Ex02 getInstance(){
        if(ex == null){
            ex = new Ex02();
        }
        return ex;
    }
    在要创建Ex02对象的地方调用上述方法,可以保证对象的唯一性
      

  3.   

    代码没看··就看了一下你的中文··呵呵··但是想想·你可能是初值设置的地方不对··当成成员变量的话会一直有初始值··应该设置初始值为null··
    还有··建议楼主使用内部类来设置监听器··
      

  4.   

    TO Tassdars:感谢,我把这个对象去掉,全部改成Ex02.this,就可以了。一开始没看到,点击按钮后就出现了第二个窗口。关于无限递归,因为这个对象是放在监听事件里面的,只要在第二个打开的窗口中这个事件不进行,就不会进行第二次的递归。TO qingtianliuyun:感谢,已解决TO cenhuineng:…………你真的代码连瞟都没瞟一眼= =