Пишу небольшую сетевую игру. Есть непонятная проблема с клеинтовым GUI - вываливается NullPointerException
Сначала код.
clientGUI:
Код | public class ClientGUI { Client clientTCP;
private JPanel createEnterNamePanel() { enterNamePanel = new JPanel(); enterYourNameTxT = new JTextField("Enter your name:", 20); enterTheGameButton = new JButton(new StartClientAction(this)); enterNamePanel.setSize(250, 60); enterNamePanel.setLocation(25, 35); //enterNamePanel.setBackground(Color.black); enterNamePanel.add(enterYourNameTxT); enterNamePanel.add(enterTheGameButton); enterTheGameButton.setText("Enter the Game"); return enterNamePanel; }
private JPanel createSendWordPanel() { JPanel sendWordPanel = new JPanel(); sendWordPanel.setSize(320, 70); sendWordPanel.setLocation(0, 200); // sendWordPanel.setBackground(Color.pink); sendWordPanel.setBorder(BorderFactory.createTitledBorder("Enter your word here")); enterWordTxT = new JTextField(18); enterWordTxT.setEnabled(false); sendWordPanel.add(enterWordTxT); sendWordButton = new JButton(new SendWordAction(this)); sendWordButton.setText("Send word"); sendWordButton.setEnabled(false); sendWordPanel.add(sendWordButton); return sendWordPanel; }
public void startTCPClient(final String userName) { Runnable r = new Runnable() { public void run() { try { clientTCP = new Client(userName, ClientGUI.this); } catch (IOException e) { System.out.println("ERRROR!"); System.out.println(e); } } }; Thread t = new Thread(r); t.start(); } public void sendWordToServer() { clientTCP.hmm = true; }
public static void main(String args[]) {
Runnable r = new Runnable() { public void run() { frame = new JFrame("COMN Assignment 1 - Jan Domozilov - 0789133 - Client"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setPreferredSize(new Dimension(300, 150)); ClientGUI clientGUI = new ClientGUI(); frame.add(clientGUI.createEnterNamePanel()); frame.add(clientGUI.createTMPPanel()); frame.pack(); frame.setVisible(true); } };
SwingUtilities.invokeLater(r); } }
|
STartClientAction:
Код | import java.awt.event.ActionEvent; import javax.swing.AbstractAction;
public class StartClientAction extends AbstractAction { private static final long serialVersionUID = 1L; private ClientGUI clientGUI;
public StartClientAction(ClientGUI clientGUI) { this.clientGUI = clientGUI; }
public void actionPerformed(ActionEvent e) { clientGUI.startTCPClient(clientGUI.enterYourNameTxT.getText()); }; }
|
SendWordAction
Код | import java.awt.event.ActionEvent; import javax.swing.AbstractAction;
public class SendWordAction extends AbstractAction { private static final long serialVersionUID = 1L; private ClientGUI clientGUI; public SendWordAction(ClientGUI clientGUI) { this.clientGUI = clientGUI; } public void actionPerformed(ActionEvent e) { clientGUI.sendWordToServer(); };
}
|
Теперь описание проблемы:
В теории это работает так. Открывается окно (функция main), там в поле вводится, к примеру, имя, наживается кнопка. Кнопка нажимается вот эта
Код | enterTheGameButton = new JButton(new StartClientAction(this));
|
и следовательно вызывается StartClientAction в котором (смотри код) вызывается
Код | clientGUI.startTCPClient(clientGUI.enterYourNameTxT.getText());
|
которое отлично работает. Потом на этой же форме появляется другая кнопка, а именно sendWordButton = new JButton(new SendWordAction(this)); и по ее нажатию вызывается соответственно SendWordAction и вооот тут...
clientGUI.sendWordToServer(); - выдает NullPointerException, потому что якобы объект clientTCP вот тут:
clientTCP.hmm = true;
не инициализирован.
Так как же он не инициализирован, если кнопочка, вызывающая StartClientAction была нажат уже черт знает когда. Что я упускаю?
Есть подозрение, что проблема в том, что я что-о вызываю из одного Threada, а что-то из другого.
Спасибо! |