146 percent Russian
146 percent Russian

Reputation: 2096

Listener doesn't work

I'm writing a Java programm, according to MVC model.

So the problem is that the Frame doesn't react to button click. (The text, that I write isn't added to the TextArea after click)

At first I call constructors for View and Controller

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

Here is the part of MessageFrameListener class (controller)

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();
    }
}
}

Here is the part from MessageFrame class (View)

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);
}


}

Upvotes: 2

Views: 212

Answers (3)

Mattias Isegran Bergander
Mattias Isegran Bergander

Reputation: 11909

You will definately find the answer if you check the output of your program or debug it.

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)

Your are hiding the reference to the JButton sendButton by declaring it again in the constructor so the field is never initialised.

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

Upvotes: 2

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

Since you've posted code scraps and have not posted a functioning SSCCE that we can test, all we can do is guess -- so you'll get what you paid for, and here goes my guess:

You're listening on the wrong MessageFrame. Your program has 2 or more MessageFrame objects, one of which is displayed, and the other which is being listened to, and so your displayed MessageFrame will of never trip the listener.

If this doesn't help, and you need better help, then please provide us with a better question, and an sscce.

Upvotes: 2

Mattias Isegran Bergander
Mattias Isegran Bergander

Reputation: 11909

You are adding an empty string:

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("");

Upvotes: 1

Related Questions