2012-03-29 64 views
1

我有一款遊戲使用顯示遊戲信息的JFrame。只要玩家向服務器發送移動對象,窗口就會更新。它適用於任何數量的移動對象。然而,一旦3ND依次啓動它撞到一堵牆,這裏是發生了什麼:Java Swing JFrame突然停止響應鼠標輸入,但仍然需要鍵盤輸入

  • JFrame中完全停止響應鼠標左鍵和右鍵點擊(它使一個窗口丁聲,當你嘗試點擊)
  • 的JFrame仍然響應鼠標滾動和鍵盤輸入
  • JFrame從alt-tab程序列表中消失。
  • 沒有錯誤消息或堆棧跟蹤。
  • 使用souts看來該代碼達到必要的代碼,所有的點正確
  • 我甚至無法點擊「X」窗口按鈕或右鍵單擊關閉任務欄
  • 3號轉對象結構與之前的轉彎物體相同

什麼在地球上可以導致程序做到這一點?

+2

後的一個SSCCE http://sscce.org – 2012-03-29 23:33:05

+0

我不認爲我可以(我知道這將讓幫助我很辛苦)。我真正想知道的是,如果有人知道這樣的事情可以預見的發生,而不會導致堆棧跟蹤。那麼也許我可以找到問題。 – Robert 2012-03-29 23:42:48

+1

某些模式對話框會在後臺運行,並且不屬於您的JFrame?使用調試器可能有助於暫停EDT並查看堆棧跟蹤?您也可以使用JConsole – 2012-03-29 23:45:35

回答

4

event dispatch thread已引發異常。它會自動重新啓動,但您的程序仍處於您描述的狀態。另見How can I catch Event Dispatch Thread (EDT) exceptionsanswer

補充:How uncaught exceptions are handledUncaught exceptions in GUI applications可能會有所幫助。同時檢查空的異常處理程序。

附錄:下面是一個例子。

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

/** @see https://stackoverflow.com/a/9935287/230513 */ 
public class Fail extends JPanel { 

    private static final JLabel label = new JLabel(
     "123456789", JLabel.CENTER); 

    public Fail() { 
     this.setLayout(new GridLayout(0, 1)); 
     this.add(label); 
     this.add(new JButton(new AbstractAction("Kill me, now!") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JButton b = (JButton) e.getSource(); 
       b.setText(String.valueOf(1/0)); 
      } 
     })); 
     new Timer(100, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       label.setText(String.valueOf(System.nanoTime())); 
      } 
     }).start(); 
    } 

    private void display() { 
     JFrame f = new JFrame("Example"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Fail().display(); 
      } 
     }); 
    } 
} 
+0

我在鏈接中使用了「MyExceptionHandler」示例並在main中註冊它。問題發生時,什麼也沒有顯示出來。 – Robert 2012-03-30 01:03:55

+0

哎。接下來我會尋找空的異常處理程序。 – trashgod 2012-03-30 01:06:51

+0

我找不到任何東西=(我可能不得不求助於我的一週舊備份... – Robert 2012-03-30 02:12:13