2011-07-21 84 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爲空。