簡體   English   中英

從另一個JFrame執行JFrame

[英]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再次更新。

擺動既是單線程的,也不是線程安全的。 這意味着:

  • 您絕對不應在事件分配線程的上下文中執行任何長時間運行或阻止的操作
  • 您永遠不要從事件調度線程的上下文外部更新UI的狀態(或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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM