我想我需要添加一个keylistener

时间:2014-10-31 13:08:49

标签: java swing button text server

我有这个代码是一个聊天客户端,可以与我正在使用的服务器一起工作。在textEnter字段中,我想要它,所以如果按Enter键,它就会像单击“发送”按钮一样执行相同的操作。如果你们中的任何一个人能帮我找到办法,我将非常感激。



package TryOne;
/* Things to do
 * 1.fix (java.lang.ArrayIndexOutOfBoundsException: 2)  "remove spaces and new lines after text"
 * 2.fix user names not being cleared after disconnect
 * 3.fix server chat logs
 * 4.
 */
import java.net.*;
import java.awt.event.KeyEvent;
import java.io.*;
import java.util.*;

import javax.swing.JTextField;

public class ChatClient extends javax.swing.JFrame {
  static String username; /* if user names don't copy to the field correctly remove static*/
  String serverIP = "localhost";
  int Port = 13;
  Socket sock;
  BufferedReader reader;
  PrintWriter writer;
  ArrayList < String > userList = new ArrayList();
  Boolean isConnected = false;
  static Boolean isPressed = false;


  /** Creates new form Chat */
  public ChatClient() {
    initComponents();
  }

  public class IncomingReader implements Runnable {

    public void run() {
      String[] data;
      String stream, done = "Done", connect = "Connect", disconnect = "Disconnect", chat = "Chat";







      /*if(isPressed){
				sendButton.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent evt) {
						sendButtonActionPerformed(evt);
						System.out.println(evt);
					}});
				isPressed = false;
			}*/

      try {
        while ((stream = reader.readLine()) != null) {

          data = stream.split(":");

          if (data[2].equals(chat)) {

            chatTextArea.append(data[0] + ": " + data[1] + "\n");
            chatTextArea.setCaretPosition(chatTextArea
              .getDocument().getLength());

          } else if (data[2].equals(connect)) {

            chatTextArea.removeAll();
            userAdd(data[0]);

          } else if (data[2].equals(disconnect)) {

            userRemove(data[0]);

          } else if (data[2].equals(done)) {

            usersList.setText("");
            writeUsers();
            userList.clear();

          }

        }
      } catch (Exception ex) {}
    }
  }

  public void ListenThread() {
    Thread IncomingReader = new Thread(new IncomingReader());
    IncomingReader.start();
  }

  public void userAdd(String data) {
    userList.add(data);

  }

  public void userRemove(String data) {
    chatTextArea.append(data + " has disconnected.\n");

  }

  public void writeUsers() {
    String[] tempList = new String[(userList.size())];
    userList.toArray(tempList);
    for (String token: tempList) {

      usersList.append(token + "\n");

    }

  }

  public void sendDisconnect() {

    String bye = (username + ": :Disconnect");
    try {
      writer.println(bye); // Sends server the disconnect signal.
      writer.flush(); // flushes the buffer
    } catch (Exception e) {
      chatTextArea.append("Could not send Disconnect message.\n");
    }

  }


  public void Disconnect() {

    try {
      chatTextArea.append("Disconnected.\n");
      sock.close();
    } catch (Exception ex) {
      chatTextArea.append("Failed to disconnect. \n");
    }
    isConnected = false;
    usernameField.setEditable(true);
    usersList.setText("");

  }

  /**
   * This method is called from within the constructor to initialize the form.
   * WARNING: Do NOT modify this code. The content of this method is always
   * regenerated by the Form Editor.
   */
  @
  SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
  private void initComponents() {

      jScrollPane1 = new javax.swing.JScrollPane();
      inputTextArea = new javax.swing.JTextArea();
      jScrollPane2 = new javax.swing.JScrollPane();
      chatTextArea = new javax.swing.JTextArea();
      jLabel1 = new javax.swing.JLabel();
      usernameField = new javax.swing.JTextField();
      connectButton = new javax.swing.JButton();
      disconnectButton = new javax.swing.JButton();
      sendButton = new javax.swing.JButton();
      jScrollPane3 = new javax.swing.JScrollPane();
      usersList = new javax.swing.JTextArea();
      jLabel2 = new javax.swing.JLabel();
      jMenuBar1 = new javax.swing.JMenuBar();
      jMenu1 = new javax.swing.JMenu();
      jMenuItem1 = new javax.swing.JMenuItem();

      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
      setTitle("Chat Client");

      inputTextArea.setColumns(20);
      inputTextArea.setLineWrap(true);
      inputTextArea.setRows(5);
      jScrollPane1.setViewportView(inputTextArea);

      chatTextArea.setColumns(20);
      chatTextArea.setEditable(false);
      chatTextArea.setFont(new java.awt.Font("Times New Roman", 0, 12)); // NOI18N
      chatTextArea.setLineWrap(true);
      chatTextArea.setRows(5);
      jScrollPane2.setViewportView(chatTextArea);

      jLabel1.setText("Username:");

      usernameField.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
          usernameFieldActionPerformed(evt);
        }
      });

      connectButton.setText("Connect");
      connectButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
          connectButtonActionPerformed(evt);
        }
      });

      disconnectButton.setText("Disconnect");
      disconnectButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
          disconnectButtonActionPerformed(evt);
        }
      });

      sendButton.setText("Send");
      sendButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
          sendButtonActionPerformed(evt);
          System.out.println(evt);
        }
      });

      usersList.setEditable(false);
      usersList.setColumns(20);
      usersList.setRows(5);
      jScrollPane3.setViewportView(usersList);

      jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
      jLabel2.setText("Online Users");

      jMenu1.setText("File");

      jMenuItem1.setText("Settings");
      jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
          jMenuItem1ActionPerformed(evt);
        }
      });
      jMenu1.add(jMenuItem1);

      jMenuBar1.add(jMenu1);

      setJMenuBar(jMenuBar1);

      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
        getContentPane());
      getContentPane().setLayout(layout);
      layout.setHorizontalGroup(layout
        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(
          javax.swing.GroupLayout.Alignment.TRAILING,
          layout.createSequentialGroup()
          .addContainerGap()
          .addGroup(
            layout.createParallelGroup(
              javax.swing.GroupLayout.Alignment.TRAILING)
            .addGroup(
              javax.swing.GroupLayout.Alignment.LEADING,
              layout.createSequentialGroup()
              .addGap(4, 4, 4)
              .addComponent(
                jScrollPane1,
                javax.swing.GroupLayout.PREFERRED_SIZE,
                336,
                javax.swing.GroupLayout.PREFERRED_SIZE)
              .addPreferredGap(
                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
              .addComponent(
                sendButton,
                javax.swing.GroupLayout.DEFAULT_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE,
                Short.MAX_VALUE))
            .addComponent(
              jScrollPane2,
              javax.swing.GroupLayout.Alignment.LEADING,
              javax.swing.GroupLayout.PREFERRED_SIZE,
              419,
              javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGroup(
              layout.createSequentialGroup()
              .addComponent(
                jLabel1,
                javax.swing.GroupLayout.PREFERRED_SIZE,
                71,
                javax.swing.GroupLayout.PREFERRED_SIZE)
              .addPreferredGap(
                javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
              .addComponent(
                usernameField,
                javax.swing.GroupLayout.PREFERRED_SIZE,
                153,
                javax.swing.GroupLayout.PREFERRED_SIZE)
              .addPreferredGap(
                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
              .addComponent(
                connectButton)
              .addGap(18, 18,
                18)
              .addComponent(
                disconnectButton)))
          .addPreferredGap(
            javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
          .addGroup(
            layout.createParallelGroup(
              javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(
              jLabel2,
              javax.swing.GroupLayout.DEFAULT_SIZE,
              javax.swing.GroupLayout.DEFAULT_SIZE,
              Short.MAX_VALUE)
            .addComponent(jScrollPane3))
          .addContainerGap()));
      layout.setVerticalGroup(layout
        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(
          layout.createSequentialGroup()
          .addContainerGap()
          .addGroup(
            layout.createParallelGroup(
              javax.swing.GroupLayout.Alignment.BASELINE)
            .addComponent(disconnectButton)
            .addComponent(connectButton)
            .addComponent(
              usernameField,
              javax.swing.GroupLayout.PREFERRED_SIZE,
              javax.swing.GroupLayout.DEFAULT_SIZE,
              javax.swing.GroupLayout.PREFERRED_SIZE)
            .addComponent(
              jLabel1,
              javax.swing.GroupLayout.DEFAULT_SIZE,
              26, Short.MAX_VALUE)
            .addComponent(jLabel2))
          .addPreferredGap(
            javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
          .addGroup(
            layout.createParallelGroup(
              javax.swing.GroupLayout.Alignment.TRAILING,
              false)
            .addGroup(
              layout.createSequentialGroup()
              .addComponent(
                jScrollPane2,
                javax.swing.GroupLayout.PREFERRED_SIZE,
                261,
                javax.swing.GroupLayout.PREFERRED_SIZE)
              .addPreferredGap(
                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
              .addGroup(
                layout.createParallelGroup(
                  javax.swing.GroupLayout.Alignment.TRAILING,
                  false)
                .addComponent(
                  sendButton,
                  javax.swing.GroupLayout.DEFAULT_SIZE,
                  javax.swing.GroupLayout.DEFAULT_SIZE,
                  Short.MAX_VALUE)
                .addComponent(
                  jScrollPane1,
                  javax.swing.GroupLayout.DEFAULT_SIZE,
                  69,
                  Short.MAX_VALUE)))
            .addComponent(jScrollPane3))
          .addContainerGap()));

      pack();
    } // </editor-fold>

  private void connectButtonActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    if (isConnected == false) {
      username = usernameField.getText();
      usernameField.setEditable(false);

      try {
        sock = new Socket(serverIP, Port);
        InputStreamReader streamreader = new InputStreamReader(
          sock.getInputStream());
        reader = new BufferedReader(streamreader);
        writer = new PrintWriter(sock.getOutputStream());
        writer.println(username + ":has connected.:Connect"); // Displays
        // to
        // everyone
        // that
        // user
        // connected.
        writer.flush(); // flushes the buffer
        isConnected = true; // Used to see if the client is connected.
      } catch (Exception ex) {
        chatTextArea.append("Cannot Connect! Try Again. \n");
        usernameField.setEditable(true);
      }
      ListenThread();
    } else if (isConnected == true) {
      chatTextArea.append("You are already connected. \n");
    }
  }

  private void disconnectButtonActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    sendDisconnect();
    Disconnect();
  }


  public void keyPressed(KeyEvent e) {

    int key = e.getKeyCode();



  }


  private void sendButtonActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    String nothing = "";
    if ((inputTextArea.getText()).equals(nothing)) {
      inputTextArea.setText("");
      inputTextArea.requestFocus();
    } else {
      try {
        writer.println(username + ":" + inputTextArea.getText() + ":" + "Chat");
        writer.flush(); // flushes the buffer
      } catch (Exception ex) {
        chatTextArea.append("Message was not sent. \n");
      }
      inputTextArea.setText("");
      inputTextArea.requestFocus();
    }

    inputTextArea.setText("");
    inputTextArea.requestFocus();
  }

  private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    // new SettingsWindow().setVisible(true);
  }

  private void usernameFieldActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
  }

  /**
   * @param args
   *            the command line arguments
   */
  public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
        new ChatClient().setVisible(true);
      }
    });
  }

  // Variables declaration - do not modify
  private javax.swing.JTextArea chatTextArea;
  private javax.swing.JButton connectButton;
  private javax.swing.JButton disconnectButton;
  private javax.swing.JTextArea inputTextArea;
  private javax.swing.JLabel jLabel1;
  private javax.swing.JLabel jLabel2;
  private javax.swing.JMenu jMenu1;
  private javax.swing.JMenuBar jMenuBar1;
  private javax.swing.JMenuItem jMenuItem1;
  private javax.swing.JScrollPane jScrollPane1;
  private javax.swing.JScrollPane jScrollPane2;
  private javax.swing.JScrollPane jScrollPane3;
  private javax.swing.JButton sendButton;
  private javax.swing.JTextField usernameField;
  private javax.swing.JTextArea usersList;
  // End of variables declaration

}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:4)

不,永远不要在文本组件中使用KeyListener。这里你只需要在你的JTextField中添加一个ActionListener,在这个按钮上使用的那个应该可以正常工作。

事实上,你已经完成了这个,但你还没有搞定它。尝试更改此内容:

  usernameField.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
      usernameFieldActionPerformed(evt);
    }
  });

  usernameField.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
      // use the actionPerformed method you've already created for the send button
      sendButtonActionPerformed(evt);
      System.out.println(evt);
    }
  });

您还应该避免使用NetBeans窗口构建器来创建GUI,而是手动编写代码,因为这将有助于您学习Swing库。