我有一个带有多线程的TCP服务器,可以通过cli来处理它。在多个JPanel上运行多个线程并切换它们
现在我想为它编写一个GUI,以便我可以轻松启动,观察,管理和退出该多线程服务器的特定实例。首先我想到了JTable,那也是我的第一个问题:
在JTable中处理多个套接字(而不是线程)上的多个serverthread是否是一种好的方法(或者甚至可能),并且我能够向它发送数据根据套接字活动更新单独的行?我的意思是当每一行代表一个正在运行的serverthread时,用户应该能够点击它,启动一个新的(将被添加到列表中)查看字段中的socketstatus(不管那将是),看看有多少客户是连接在一起的,甚至可以通过桌子阻止特定的线程?
我的第二个问题是:
当我开始实现它,我上面描述的方式,会发生什么情况的JTable,当我更新与另一个接口活跃JPanel并再次切换回正在运行的线程?例如,我有一个接口用于概述所有实例,另一个接口用于获取单个实例的详细信息。所有的线程会被中断吗?或者他们可以再次与桌面通信吗?还是使用cardLayout更好?
当我更换cardlayout上的卡时,此卡上正在运行的某个东西(例如带有运行套接字线的JTable)是否会被中断或停止,或者我能否更新JTable中的statusdata?所以套接字应该能够写入和更新数据到表中。
现在我最后一个问题,感谢阅读这么久。在试图找出上述所有问题的答案时,我尝试了一个简单的JPanel切换帧,每个面板上都有一个JTextarea,它可以写入100行,间隔1000毫秒。然后,我想切换面板,看看这个任务是否中断。不幸的是,我甚至无法把这个工作。
在一个外部类MyPanel中,我使用单独的配置启动一个JPanel并将它添加到主框架中。
for循环是只是为了测试:
class MyPanel extends JPanel {
public static JTextArea tArea;
public MyPanel(String config) {
JButton testButton = new JButton(config);
add(testButton);
tArea = new JTextArea();
JScrollPane scroll = new JScrollPane(tArea);
add(scroll, BorderLayout.CENTER);
for (int i = 0 ; i < 50 ; i ++) {
tArea.append("test \n") ;
try { Thread.sleep(2000); } catch(InterruptedException ie) {}
}
setVisible(true);
revalidate();
repaint();
}
}
但我认为,这是完全错误的,因为我把它叫做之前重新验证并重新绘制:(与主机内我要发起这样的说法:
JMenuItem menuItem = new JMenuItem("Test");
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
MyPanel dynamicPanel = new MyPanel("Test");
contentContainer.removeAll();
contentContainer.add(dynamicPanel);
contentContainer.revalidate();
contentContainer.repaint();
}
});
你需要知道的第一件事,Swing是一个单线程的框架,不是线程安全的,请参阅Concurrency in Swing和Worker Threads and SwingWorker。这意味着所有与UI的更新和交互都必须在UI线程(Event Dispatching Thread)内完成,请参见[Swing中的并发](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ ) – MadProgrammer 2015-02-07 03:33:14