2011-07-21 53 views
3

某些东西似乎与试图设置字符串变量的代码块有关,不管我在运行程序时做什么,对话框总是显示otto。有谁知道我在这里做错了吗?java初学者if/else如果问题

感谢, 猎食

import java.awt.FlowLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JOptionPane; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 

public class SmallTingz extends JFrame { 
    private JLabel item1; 
    private JTextField tf; 
    private JTextField tf2; 
    private JTextField tf3; 
    private JPasswordField pf; 

    public SmallTingz() { 
     super("The Title"); 
     setLayout(new FlowLayout()); 
     JTextField tf = new JTextField("Cool Beans"); 
     JTextField tf2 = new JTextField("UnCool Beans"); 
     JTextField tf3 = new JTextField("Hot Beans"); 
     JPasswordField pf = new JPasswordField("password"); 

     add(tf); 
     add(tf2); 
     add(tf3); 
     add(pf); 

     thehandler handler = new thehandler(); 
     tf.addActionListener(handler); 
     tf2.addActionListener(handler); 
     tf3.addActionListener(handler); 
     pf.addActionListener(handler); 
    } 

    private class thehandler implements ActionListener { 

     public void actionPerformed(ActionEvent event) { 
      String string;   
      if (event.getSource() == tf) 
       string=String.format("field1: %s", event.getActionCommand()); 
      else if (event.getSource() == tf2) 
       string=String.format("field2: %s", event.getActionCommand()); 
      else if (event.getSource() == tf3) 
       string=String.format("field3: %s", event.getActionCommand()); 
      else if (event.getSource() == pf) 
       string=String.format("passfield: %s", event.getActionCommand()); 
      else 
       string="otto"; 

      JOptionPane.showMessageDialog(null, string);   
     } 
    } 
} 
+0

您应该在if语句中使用“.equals()”而不是“==”。例如if(event.getSource()。equals(tf))“tf”和“event.getSource()”必须是相同类型 – fsonmezay

+0

尝试通过调试器运行此操作,打破actionPerformed。然后检查事件的运行时间值。 – jpm

+0

@fsonmezay getSource()返回发出源的实际组件的引用。因此,在这种情况下,对参考平等进行测试实际上是正确的。否则,如果您有两个subl压缩的JButton,其overrode等于基于它们的标签,则无法区分两个不同按钮之间按下等同标签的区别。 – jpm

回答

12

在你SmallTingz()构造,删除所有变量声明。您的声明是hiding成员变量。

变化

JTextField tf = new JTextField("Cool Beans"); 
JTextField tf2 = new JTextField("UnCool Beans"); 
JTextField tf3 = new JTextField("Hot Beans"); 
JPasswordField pf = new JPasswordField("password"); 

tf = new JTextField("Cool Beans"); 
tf2 = new JTextField("UnCool Beans"); 
tf3 = new JTextField("Hot Beans"); 
pf = new JPasswordField("password"); 
+0

+1,我认为这是问题所在。 – Moonbeam

+0

这是正确的答案。 – Marcelo

+4

如果他已经完成了所有这些文本字段的最终解决,那么在编译时就会发现这个问题。 :) –

1

两件事情。

首先,我时时处处我可以用括号与否则,如果

if(...){ 
//do stuff 
} 
else 
{ 
    if(...) 
    { 
    // other stuff. 
    } 
} 

这使得它更容易阅读。可读性是编写代码最重要的方面之一。

其次,这是学习如何使用调试器的好机会。我怀疑你正在使用eclipse。单击if(event.getSource()==tf)的边距 应该出现一个小红点,这是一个断点。现在在调试模式下运行你的代码。

执行应停止在该行。将鼠标光标悬停在“事件”变量上。您应该看到一个弹出窗口,向您显示该对象的描述。像user802421说

这会帮助你理解为什么的getSource()不返回一个指向您的JTextField(S)

也许你会看到TF为空。