[英]Execute JFrame from Another JFrame
我正在制作一個客戶端服務器應用程序,其中服務器代碼由JFrame執行。這是我的服務器代碼,當我從MyServer類的main方法調用Show方法然后正在運行時,但是當我從Jframe的Key Event調用時它正在運行沒有顯示另一個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
正在創建一個無限循環,並在Event Dispatching Thread的上下文中全部調用一個阻塞方法-阻塞它並阻止UI再次更新。
擺動既是單線程的,也不是線程安全的。 這意味着:
您需要閱讀並了解Swing中的Concurrency,以更好地理解問題。
您還應該密切注意Worker Threads和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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.