<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=Marauroa_Chat_Tutorial%2FSwing_Client</id>
	<title>Marauroa Chat Tutorial/Swing Client - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=Marauroa_Chat_Tutorial%2FSwing_Client"/>
	<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=Marauroa_Chat_Tutorial/Swing_Client&amp;action=history"/>
	<updated>2026-05-06T12:14:55Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://game.etao.net/w/index.php?title=Marauroa_Chat_Tutorial/Swing_Client&amp;diff=136&amp;oldid=prev</id>
		<title>2020年4月28日 (二) 06:26 imported&gt;郑宇琳</title>
		<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=Marauroa_Chat_Tutorial/Swing_Client&amp;diff=136&amp;oldid=prev"/>
		<updated>2020-04-28T06:26:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Navigation for Marauroa Top|Using}}&lt;br /&gt;
{{Navigation for Marauroa Users}}&lt;br /&gt;
{{Marauroa Chat Tutorial}}&lt;br /&gt;
&lt;br /&gt;
== 编码 ==&lt;br /&gt;
Client类的设计使我们可以轻松地在比上面的Test类更复杂的地方使用它。 这是一个使用客户端作为通讯工具的简单Swing应用程序的示例&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import java.awt.event.*;&lt;br /&gt;
import javax.swing.*;&lt;br /&gt;
&lt;br /&gt;
public class View extends JFrame implements ActionListener {&lt;br /&gt;
  private javax.swing.JButton jSayButton;&lt;br /&gt;
  private javax.swing.JButton jConnectButton;&lt;br /&gt;
  private javax.swing.JScrollPane jScrollPane1;&lt;br /&gt;
  private javax.swing.JTextArea jChatArea;&lt;br /&gt;
  private javax.swing.JTextField jInputField;&lt;br /&gt;
  private javax.swing.Timer timer;&lt;br /&gt;
&lt;br /&gt;
  private Client client = null;&lt;br /&gt;
&lt;br /&gt;
  public View() {&lt;br /&gt;
    initComponents();&lt;br /&gt;
    jSayButton.addActionListener(&lt;br /&gt;
      new ActionListener() {&lt;br /&gt;
        @Override&lt;br /&gt;
        public void actionPerformed(ActionEvent e) {&lt;br /&gt;
          String message = jInputField.getText();&lt;br /&gt;
          jInputField.setText(&amp;quot;&amp;quot;);&lt;br /&gt;
          client.sendMessage(message);&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
    jConnectButton.addActionListener(&lt;br /&gt;
      new ActionListener() {&lt;br /&gt;
        @Override&lt;br /&gt;
        public void actionPerformed(ActionEvent e) {&lt;br /&gt;
          try {&lt;br /&gt;
            client = Client.get();&lt;br /&gt;
            client.connect(&amp;quot;127.0.0.1&amp;quot;, 5555);&lt;br /&gt;
            client.login(&amp;quot;test1&amp;quot;, &amp;quot;test1&amp;quot;);&lt;br /&gt;
            client.chooseCharacter(&amp;quot;test1&amp;quot;);&lt;br /&gt;
            jSayButton.setEnabled(true);&lt;br /&gt;
            jInputField.setEnabled(true);&lt;br /&gt;
          } catch (Exception exception) {&lt;br /&gt;
            JOptionPane.showMessageDialog(&lt;br /&gt;
              View.this, &amp;quot;Error&amp;quot;, exception.toString(), JOptionPane.WARNING_MESSAGE);&lt;br /&gt;
            client = null;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
    timer = new javax.swing.Timer(300, this);&lt;br /&gt;
    timer.setInitialDelay(500);&lt;br /&gt;
    timer.start(); &lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @Override&lt;br /&gt;
  public void actionPerformed(ActionEvent e) {&lt;br /&gt;
    if (client != null) {&lt;br /&gt;
      client.loop(0);&lt;br /&gt;
      String s = client.popQuote();&lt;br /&gt;
      while (s != null) {&lt;br /&gt;
        jChatArea.append(s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
        s = client.popQuote();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  private void initComponents() {&lt;br /&gt;
    jScrollPane1 = new javax.swing.JScrollPane();&lt;br /&gt;
    jChatArea = new javax.swing.JTextArea();&lt;br /&gt;
    jSayButton = new javax.swing.JButton();&lt;br /&gt;
    jConnectButton = new javax.swing.JButton();&lt;br /&gt;
    jInputField = new javax.swing.JTextField();&lt;br /&gt;
&lt;br /&gt;
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);&lt;br /&gt;
    setTitle(&amp;quot;Chat 0.5&amp;quot;);&lt;br /&gt;
    setName(&amp;quot;main&amp;quot;);&lt;br /&gt;
    jChatArea.setColumns(20);&lt;br /&gt;
    jChatArea.setEditable(false);&lt;br /&gt;
    jChatArea.setRows(5);&lt;br /&gt;
    jScrollPane1.setViewportView(jChatArea);&lt;br /&gt;
&lt;br /&gt;
    jSayButton.setText(&amp;quot;Say&amp;quot;);&lt;br /&gt;
    jSayButton.setEnabled(false);&lt;br /&gt;
&lt;br /&gt;
    jConnectButton.setText(&amp;quot;Connect&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    jInputField.setEnabled(false);&lt;br /&gt;
&lt;br /&gt;
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());&lt;br /&gt;
    getContentPane().setLayout(layout);&lt;br /&gt;
    layout.setHorizontalGroup(&lt;br /&gt;
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)&lt;br /&gt;
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()&lt;br /&gt;
        .addContainerGap()&lt;br /&gt;
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)&lt;br /&gt;
          .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 394, Short.MAX_VALUE)&lt;br /&gt;
          .addGroup(layout.createSequentialGroup()&lt;br /&gt;
            .addComponent(jInputField, javax.swing.GroupLayout.PREFERRED_SIZE, 236, javax.swing.GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)&lt;br /&gt;
            .addComponent(jSayButton, javax.swing.GroupLayout.DEFAULT_SIZE, 73, Short.MAX_VALUE)&lt;br /&gt;
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)&lt;br /&gt;
            .addComponent(jConnectButton)))&lt;br /&gt;
        .addContainerGap())&lt;br /&gt;
    );&lt;br /&gt;
    layout.setVerticalGroup(&lt;br /&gt;
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)&lt;br /&gt;
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()&lt;br /&gt;
        .addContainerGap()&lt;br /&gt;
        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 249, Short.MAX_VALUE)&lt;br /&gt;
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)&lt;br /&gt;
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)&lt;br /&gt;
          .addComponent(jConnectButton)&lt;br /&gt;
          .addComponent(jSayButton)&lt;br /&gt;
          .addComponent(jInputField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))&lt;br /&gt;
        .addContainerGap())&lt;br /&gt;
    );&lt;br /&gt;
    pack();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了创建元素的布局，使用了NetBeans，但是我们在这里仅关注源代码。&lt;br /&gt;
&lt;br /&gt;
按下“连接”按钮后，客户端将建立到硬编码位置的连接。 没有“创建新帐户”功能，因此应事先创建帐户。&lt;br /&gt;
&lt;br /&gt;
我们使用计时器来定期检查客户端队列中的新消息。 如果有的话-将它们放在大文本框中。 发送新消息还取决于客户端功能。&lt;br /&gt;
&lt;br /&gt;
现在，留给Swing客户端的唯一方法是main方法。 这是源代码&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public final class Chat {&lt;br /&gt;
  private Chat() {}&lt;br /&gt;
&lt;br /&gt;
  public static void main( String[] args ) {&lt;br /&gt;
    new View();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 部署 ==&lt;br /&gt;
您仍然使用相同的命令进行编译&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
javac -cp marauroa.jar;log4j.jar;. *.java&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
确保带有Swing客户端代码的源文件与提到的jar和Client.java文件位于同一目录中。 您可以使用以下命令运行客户端&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java -cp marauroa.jar;h2.jar;log4j.jar;. Chat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 下一步 ==&lt;br /&gt;
&lt;br /&gt;
恭喜，您已完成本教程。 最后几节将列出一些提高游戏可玩性的想法[[Marauroa Chat Tutorial/Next Steps|进一步提高的步骤]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Marauroa]]&lt;br /&gt;
{{#breadcrumbs: [[Marauroa]] | [[Navigation for Marauroa Users|使用]] | [[Marauroa Chat Tutorial|教程]] | [[Marauroa Chat Tutorial/Swing Client|Swing 客户端]]}}&lt;/div&gt;</summary>
		<author><name>imported&gt;郑宇琳</name></author>
	</entry>
</feed>