gpt4 book ai didi

java - 从另一个 JFrame 执行 JFrame

转载 作者:行者123 更新时间:2023-12-01 19:57:39 25 4
gpt4 key购买 nike

我正在制作一个客户端服务器应用程序,其中服务器代码由 JFrame 执行这是我的服务器代码,当我从 MyServer 类的主方法调用 Show 方法时,它正在工作,但是当我从 Jframe 的关键事件调用它时,它不显示另一个 Jframe。请帮忙。

public class MyServer 
public void Show() throws IOException {
ServerSocket ss = new ServerSocket(6666);
new IPScanning().dispose();
int count = 0;
while (true) {
Socket s = null;
try {
s = ss.accept();
SocketThread socketThread = new SocketThread(s, count);
socketThread.start();
} catch (Exception e) {
ss.close();
s.close();
System.out.println(e);
} finally {
count++;
}
}
}

class SocketThread extends Thread {
public void run() {
try {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ShowTable.INSTANCE.showdata(count, host, ip, username, os_name, os_arch, pro_detail, Mac_add, disk_size, max_memory);
}
});
} catch (Exception e) {
System.out.println("Server Problem");
System.out.println(e);
}
}
}
}`

这是我的关键事件

  private void jStartActionPerformed(java.awt.event.ActionEvent evt) {                                       
MyServer ms=new MyServer();
try {
ms.Show();
} catch (IOException ex) {
System.out.println(ex);
}
}

通过SocketThread类调用另一个JFrame的代码。

 public enum ShowTable{
INSTANCE;
private JFrame f = new JFrame();
private JTable jt = new JTable(new DefaultTableModel());
private DefaultTableModel model = (DefaultTableModel) jt.getModel();
private ShowTable() {
jt.setBounds(30, 40, 200, 300);
jt.setFocusable(false);
jt.setRowSelectionAllowed(false);
JScrollPane sp = new JScrollPane(jt);
f.add(sp);
f.setSize(1300, 600);
}
public void showdata(int count,String host,String ip,String username,String os_name,String os_arch,String pro_detail,String Mac_add,float disk_size,float max_memory){
f.setVisible(true);
}
}

最佳答案

private void jStartActionPerformed(java.awt.event.ActionEvent evt) {                                       
MyServer ms=new MyServer();
try {
ms.Show();
} catch (IOException ex) {
System.out.println(ex);
}
}

建议调用此方法来响应 UI 中的某些操作(例如按下按钮),这意味着事件是从事件调度线程的上下文中调度的。

这意味着 MyServer#show 在事件调度线程的上下文中被调用。

所以如果我们看一下......

public void Show() throws IOException {
ServerSocket ss = new ServerSocket(6666);
new IPScanning().dispose();
int count = 0;
while (true) {
Socket s = null;
try {
s = ss.accept();
SocketThread socketThread = new SocketThread(s, count);
socketThread.start();
} catch (Exception e) {
ss.close();
s.close();
System.out.println(e);
} finally {
count++;
}
}
}

我们可以看到 Show 正在创建一个无限循环,并在事件调度线程的上下文中调用阻塞方法 - 阻止它并防止 UI 再次更新。

Swing 既是单线程的,又不是线程安全的。这意味着:

  • 您不应该在事件调度线程的上下文中执行任何长时间运行或阻塞的操作
  • 您永远不应该从事件调度线程的上下文之外更新 UI 的状态(或 UI 所依赖的任何内容)

你需要去读一下Concurrency in Swing以便更好地了解该问题。

您还应该密切关注Worker Threads and SwingWorker因为它们将有助于提供解决您问题的答案。

但是,一个过于简单的解决方案可能是简单地使用另一个Thread来运行MyServer#Show方法...

private void jStartActionPerformed(java.awt.event.ActionEvent evt) {                                       
new Thread(new Runnable() {
@Override
public void run() {
try {
MyServer ms=new MyServer();
ms.Show();
} catch (IOException ex) {
System.out.println(ex);
}
}
}

关于java - 从另一个 JFrame 执行 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49042362/

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