2012-05-06 162 views
2

根據MVC模型,我正在編寫Java程序。監聽器不工作

所以問題是框架不響應按鈕點擊。 (文字,我寫的是不添加到點擊後的文本區)

起初我呼籲視圖和控制器

   MessageFrame mf = new MessageFrame(con); 
       MessageFrameListener mfl = new MessageFrameListener(mf); 

這裏的構造是MessageFrameListener類(控制器)的一部分

public class MessageFrameListener{ 
private MessageFrame mf; 

public MessageFrameListener(MessageFrame m_f){ 
    mf = m_f; 
    m_f.addButtonListener(new SButtonListener()); 
} 

//@Override 
public class SButtonListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e) { 
      String insert = mf.getInput(); 
      mf.addLine(insert); 
      mf.refreshInput(); 
    } 
} 
} 

這裏是從MessageFrame類(查看)的部分

public class MessageFrame{ 

public JTextField messField; 
public JTextArea dialogArea; 
public JButton sendButton; 
public JFrame frame; 
public Contact con; 
public MessageFrame (Contact con_get) { 
    con = con_get; 
    frame = new JFrame(); 

    frame.setSize(538, 299); 

    JPanel panel_1 = new JPanel(); 
    frame.getContentPane().add(panel_1, BorderLayout.NORTH); 

    JPanel panel_2 = new JPanel(); 
    frame.getContentPane().add(panel_2, BorderLayout.SOUTH); 
    panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS)); 

    messField = new JTextField(); 
    panel_2.add(messField); 
    messField.setColumns(10); 

    JButton sendButton = new JButton("Send"); 
    panel_2.add(sendButton); 

    JPanel panel_3 = new JPanel(); 
    frame.getContentPane().add(panel_3, BorderLayout.EAST); 

    JPanel panel_4 = new JPanel(); 
    frame.getContentPane().add(panel_4, BorderLayout.CENTER); 
    panel_4.setLayout(new BorderLayout(0, 0)); 

    JTextArea dialogArea = new JTextArea(); 
    panel_4.add(dialogArea); 
    frame.setVisible(true); 


} 

public String getInput(){ 
    return messField.getText(); 
} 

public void refreshInput(){ 
    messField.setText(""); 
} 

public void addLine(String line){ 
    dialogArea.append(line); 
} 

public void addButtonListener(ActionListener bal){ 
    sendButton.addActionListener(bal); 
} 


} 
+0

我想接受一些問題,但他們很可能對我來說很難 –

+2

我不確定我是否理解該評論。你可以(如果你想)接受_answers_你的問題。你問的第一個問題有一個答案,你評論說這個答案有效。例如,你可以接受這一個。 (這就是你對最能幫助你的人說「感謝」的方式。) – Mat

+0

對不起,我錯誤地理解了你的評論。我以爲你在談論回答問題。我會盡力接受 –

回答

2

如果您檢查程序的輸出或進行調試,您一定會找到答案。

Exception in thread "main" java.lang.NullPointerException 
    at test3.MessageFrame.addButtonListener(Main.java:93) 
    at test3.MessageFrameListener.<init>(Main.java:28) 
    at test3.Main.main(Main.java:18) 

你是通過在構造函數中再次宣稱它等等領域是從來沒有初始化隱藏參考的JButton sendButton。

JButton sendButton = new JButton("Send"); 
panel_2.add(sendButton); 
+0

關於重新宣佈,您有什麼建議? –

+0

不要這樣做?而不是再次聲明它'JButton sendButton = new ...'只是初始化它'sendButton = new ...'。就像你用'messField'做的那樣 –

+0

優秀的接機! 1+ –

1

你加入一個空字符串:

String insert = mf.getInput(); //all it does is: messField.getText(); 
mf.addLine(insert); //adding the empty string 
mf.refreshInput(); //all it does is: messField.setText(""); 
+0

但是,當然我在messField中寫了一些東西 –

+0

啊,您是手動輸入文本到該字段?那麼對不起。 –

+1

我在第一個回答中添加了評論 –

2

既然你已經發布的代碼碎片,並沒有公佈一個功能SSCCE,我們可以測試,所有我們能做的就是猜測 - 所以你會得到你所支付爲,這裏我猜:

你正在傾聽錯誤的MessageFrame。你的程序有兩個或更多的MessageFrame對象,其中一個被顯示,另一個被監聽,所以你的顯示的MessageFrame將永遠不會觸發監聽器。

如果這沒有幫助,你需要更好幫助,那麼請向我們提供一個更好的問題sscce