【问题标题】:Including JCheckBox in JFrame as and when a client connects在客户端连接时在 JFrame 中包含 JCheckBox
【发布时间】:2017-05-02 23:15:40
【问题描述】:

我正在尝试用 java 编写一个服务器应用程序并创建一个向量 v1 来存储所有命中服务器的套接字。

接下来我创建了一个数组列表,在其中将所有客户端套接字存储为对象,然后创建了一个 JCheckBox 数组,在其中循环它以将复选框添加到在类构造函数中启动的 JPanel 控制面板,但似乎出了点问题,我看不到任何复选框。

import java.util.*;
import java.net.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.awt.*;

class server extends JFrame implements ActionListener {

    JTextArea t1;
    PrintWriter pw;
    JButton b1, b2;
    static Vector v1 = new Vector();
    static ArrayList checks = new ArrayList();
    static JPanel controlpanel;

    server() {
        setLayout(new FlowLayout());
        t1 = new JTextArea();
        add(t1);
        b1 = new JButton("Send to All");
        b2 = new JButton("Send");
    //b1.addActionListener(this);
        //b2.addActionListener(this);
        add(b2, BorderLayout.SOUTH);

        add(b1, BorderLayout.NORTH);
        b1.addActionListener(this);
        b2.addActionListener(this);
        controlpanel = new JPanel();
        controlpanel.setVisible(true);
        add(controlpanel);
    }

    public void actionPerformed(ActionEvent ae) {

        String m = t1.getText();
        if (ae.getSource() == b1) {
            try {
                Iterator t2 = v1.iterator();
                while (t2.hasNext()) {
                    Socket s = (Socket) t2.next();
                    pw = new PrintWriter(s.getOutputStream(), true);
                    pw.println(m);
                    pw.flush();
                    System.out.println("send" + m);
                }
            } catch (Exception e) {
            }
        }
        if (ae.getSource() == b2) {
            try {
                Iterator itr = checks.iterator();
                while (itr.hasNext()) {
                    Socket schecked = (Socket) itr.next();
                    pw = new PrintWriter(schecked.getOutputStream(), true);
                    pw.println(m);
                    pw.flush();
                    System.out.println("sent " + m);

                }
            } catch (Exception e) {
            }
        }
        t1.setText("");
    }

    public static void main(String z[]) {

        try {
            new server().setVisible(true);
            ServerSocket s = new ServerSocket(2000);
            while (true) {
                System.out.println("waiting...");
                Socket c = s.accept();
                //          System.out.print(c);
                v1.add(c);
                for (int i = 0; i < v1.size(); i++) {
                    checks.add(v1.get(i));
                    //              checks[i].setText()=v1[i];
                }
                JCheckBox checkbox[] = new JCheckBox[checks.size()];

                for (int i = 0; i < checks.size(); i++) {
                    //  Object o=checks.get(i);
                    checkbox[i] = new JCheckBox();
                    //              checkbox[i].setText()=checks.get(i).name;
                    controlpanel.add(checkbox[i]);
                    checkbox[i].setSelected(true);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

  • A) 您需要在框架上调用 setVisible 等方法。 B) 不要把你以前从未做过的 5 件事混为一谈……而是阅读/学习向你展示如何使用框架的教程。当你让这些东西工作时......然后动态添加 ui 元素。然后当它起作用时......添加服务器部分。
  • 我在构造函数服务器中添加了控制面板,然后在 main 方法中添加了 server.setVisible(true)。 @鬼猫

标签: java arraylist checkbox collections jcheckbox


【解决方案1】:

当您在 JFrame 可见后添加 UI 元素时,您需要在面板上调用 revalidate()。此外,您永远不应该直接从不是事件调度线程的线程添加。最后,每次新客户端连接时都会出现,您将重新添加您已经添加的所有复选框,再加上一个(即当第一个客户端连接时,您将拥有一个复选框,当第二个连接时您将拥有1 + 2 = 3,当第三个连接时,您将有 1 + 2 + 3 = 6,等等)。

我强烈建议您在脑海中逐条指令地运行您的代码,看看会发生什么。或者,如果您使用的是不错的 IDE,您可以在调试器中单步执行代码并检查 controlPanel 的内容。如果你没有使用 IDE...你应该这样做。

我不太明白你需要 check[] 和 v1[] 来做什么,但假设你确实需要它们,你可以定义一个包含一个用于检查的变量的类,而不是维护三个数组,一个用于 v1,一个用于复选框,并维护此类对象的单个实例数组。

【讨论】:

  • 关于他可以使用的附加新类的好建议...但是该类不应包含 ui 元素。你永远不会混合显示和“业务逻辑”
  • 我怀疑他其实不需要任何业务逻辑,只需要复选框中已经维护的状态,但我可能错了。
猜你喜欢
  • 2016-06-23
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2019-05-29
相关资源
最近更新 更多