Marauroa Chat Tutorial/Swing Client

来自gamedev
imported>郑宇琳2020年4月28日 (二) 14:26的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索


Marauroa Tutorial

编码[编辑]

Client类的设计使我们可以轻松地在比上面的Test类更复杂的地方使用它。 这是一个使用客户端作为通讯工具的简单Swing应用程序的示例

import java.awt.event.*;
import javax.swing.*;

public class View extends JFrame implements ActionListener {
  private javax.swing.JButton jSayButton;
  private javax.swing.JButton jConnectButton;
  private javax.swing.JScrollPane jScrollPane1;
  private javax.swing.JTextArea jChatArea;
  private javax.swing.JTextField jInputField;
  private javax.swing.Timer timer;

  private Client client = null;

  public View() {
    initComponents();
    jSayButton.addActionListener(
      new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
          String message = jInputField.getText();
          jInputField.setText("");
          client.sendMessage(message);
        }
      });
    jConnectButton.addActionListener(
      new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
          try {
            client = Client.get();
            client.connect("127.0.0.1", 5555);
            client.login("test1", "test1");
            client.chooseCharacter("test1");
            jSayButton.setEnabled(true);
            jInputField.setEnabled(true);
          } catch (Exception exception) {
            JOptionPane.showMessageDialog(
              View.this, "Error", exception.toString(), JOptionPane.WARNING_MESSAGE);
            client = null;
          }
        }
      });
    timer = new javax.swing.Timer(300, this);
    timer.setInitialDelay(500);
    timer.start(); 
    setVisible(true);
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    if (client != null) {
      client.loop(0);
      String s = client.popQuote();
      while (s != null) {
        jChatArea.append(s + "\n");
        s = client.popQuote();
      }
    }
  }
  
  private void initComponents() {
    jScrollPane1 = new javax.swing.JScrollPane();
    jChatArea = new javax.swing.JTextArea();
    jSayButton = new javax.swing.JButton();
    jConnectButton = new javax.swing.JButton();
    jInputField = new javax.swing.JTextField();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("Chat 0.5");
    setName("main");
    jChatArea.setColumns(20);
    jChatArea.setEditable(false);
    jChatArea.setRows(5);
    jScrollPane1.setViewportView(jChatArea);

    jSayButton.setText("Say");
    jSayButton.setEnabled(false);

    jConnectButton.setText("Connect");

    jInputField.setEnabled(false);

    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)
          .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 394, Short.MAX_VALUE)
          .addGroup(layout.createSequentialGroup()
            .addComponent(jInputField, javax.swing.GroupLayout.PREFERRED_SIZE, 236, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jSayButton, javax.swing.GroupLayout.DEFAULT_SIZE, 73, Short.MAX_VALUE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jConnectButton)))
        .addContainerGap())
    );
    layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
        .addContainerGap()
        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 249, Short.MAX_VALUE)
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
          .addComponent(jConnectButton)
          .addComponent(jSayButton)
          .addComponent(jInputField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        .addContainerGap())
    );
    pack();
  }
}

为了创建元素的布局,使用了NetBeans,但是我们在这里仅关注源代码。

按下“连接”按钮后,客户端将建立到硬编码位置的连接。 没有“创建新帐户”功能,因此应事先创建帐户。

我们使用计时器来定期检查客户端队列中的新消息。 如果有的话-将它们放在大文本框中。 发送新消息还取决于客户端功能。

现在,留给Swing客户端的唯一方法是main方法。 这是源代码

public final class Chat {
  private Chat() {}

  public static void main( String[] args ) {
    new View();
  }
}

部署[编辑]

您仍然使用相同的命令进行编译

javac -cp marauroa.jar;log4j.jar;. *.java

确保带有Swing客户端代码的源文件与提到的jar和Client.java文件位于同一目录中。 您可以使用以下命令运行客户端

java -cp marauroa.jar;h2.jar;log4j.jar;. Chat

下一步[编辑]

恭喜,您已完成本教程。 最后几节将列出一些提高游戏可玩性的想法进一步提高的步骤. {{#breadcrumbs: Marauroa | 使用 | 教程 | Swing 客户端}}