gpt4 book ai didi

java - 当客户端连接时将 JCheckBox 包含在 JFrame 中

转载 作者:行者123 更新时间:2023-12-01 09:06:54 25 4
gpt4 key购买 nike

我正在尝试用java编写一个服务器应用程序并创建一个 vector 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();
}
}
}

最佳答案

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

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

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

关于java - 当客户端连接时将 JCheckBox 包含在 JFrame 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41196575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com