2013-02-20 106 views
0

我有一個jframe和jtextpane,我想運行一個方法,檢查端口在pc,直到用戶關閉jframe,我嘗試通過使用windowlistner,但該方法只運行一次,我希望它運行,直到用戶關閉該應用程序在Jframe的背景操作

frame = new JFrame(); 

     frame.setResizable(false); 
     frame.setBounds(100, 100, 552, 444); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     frame.addWindowListener(new WindowListener() { 

      @Override 
      public void windowOpened(WindowEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void windowIconified(WindowEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void windowDeiconified(WindowEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void windowDeactivated(WindowEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void windowClosing(WindowEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void windowClosed(WindowEvent arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void windowActivated(WindowEvent arg0) { 
       checkport(); // this run at first time only! 

      } 
     }); 
+0

檢查出['Executors'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html)framework..you'll想確保你在Event Dispatch Thread之外執行'checkport',否則你的UI將會「凍結」。 – mre 2013-02-20 14:28:52

+1

'frame.getContentPane()。setLayout(null);' - >停止使用那種非常不好的習慣。 SwingWorker在哪裏?在框架關閉之前你的意思是什麼? windowActivated在幀被激活時被調用(即,當用戶聚焦你的窗口時)。 – 2013-02-20 14:31:53

+1

1)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 2)在適當的地方使用大寫字母(句子開頭,單詞I,類名稱,如'JFrame')。閱讀就像試圖聽一個嘟someone着的人。我有更好的事情要做。 – 2013-02-20 14:34:30

回答

1

您應該使用單獨的線程用於檢查同時顯示幀開始的端口。在windowClosing事件你停止線程。

示例代碼:

frame = new JFrame(); 
    frame.setResizable(false); 
    frame.setBounds(100, 100, 552, 444); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 
    final CheckPort checkPort = new CheckPort(); 
    final Thread thread = new Thread(checkPort); 
    thread.start(); 
    frame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
      checkPort.stop(); 
      thread.interrupt(); 
     } 
    }); 

Runnable的檢查端口。

public class CheckPort implements Runnable { 
     private boolean checkPort = true; 

     public void run() { 
      while(checkPort) { 
       checkPort(); 
       try { 
        Thread.sleep(100); 
       } catch(InterruptedException ex) { 
       } 
      } 
     } 

     public void checkPort() { 
      // do check port here 
     } 

     public void stop() { 
      checkPort = false; 
     } 
    }