2010-08-30 325 views
2

我有一個簡單的帶有瀏覽按鈕的Java Swing GUI窗體。瀏覽按鈕在點擊時創建一個新的JFileChooser。Java Swing彈出窗口失去焦點並且沒有重新繪製

但是,如果在窗口打開後立即單擊瀏覽,文件選擇器窗口似乎鬆散焦點,顯示它後面的父窗口,但拒絕重新繪製自身。我必須將它從屏幕上拖出來,然後重新恢復正常。

我試圖減少我的代碼到最簡單的版本,仍然有問題。 (它只是讓一個非常大的瀏覽按鈕。

public class FormTest extends JFrame 
{ 
    private final int width = 490; 
    private final int height = 400; 

    private JPanel outerPanel; 

    private static FormTest myTest; 

    public static void main(String[] args) 
    { 
     try 
     { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

     myTest = new FormTest(); 
     myTest.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     myTest.setResizable(false); 
     myTest.addWindowListener(new WindowAdapter() 
     { 
      public void windowClosing(WindowEvent e) 
      { 
       closeWindow(); 
      } 
     }); 
     myTest.setVisible(true); 
    } 

    public FormTest() 
    { 
     super("Convert Ratings"); 

     this.setSize(width, height); 

     initComponents(); 
    } 

    private void initComponents() 
    { 
     outerPanel = new JPanel(); 
     outerPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0)); 
     outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS)); 

     outerPanel.add(Box.createRigidArea(new Dimension(0, 5))); 

     JButton myButton = new JButton("browse"); 
     myButton.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       JFileChooser fileChooser = new JFileChooser(); 

       fileChooser.showOpenDialog(myTest); 
      } 
     }); 
     outerPanel.add(myButton); 

     this.add(outerPanel); 
    } 

    private static void closeWindow() 
    { 
     int result = JOptionPane.showConfirmDialog(myTest, "Are you sure you want to close the application?", 
                "Question", JOptionPane.YES_NO_OPTION); 

     if(result == JOptionPane.YES_OPTION) 
     { 
      System.exit(0); 
     } 
    } 
} 

在這個例子中,瀏覽按鈕必須立即單擊窗口打開,約10秒後bug會脫穎而出後。

任何幫助或建議將非常感激。

感謝,

BJ

+0

哪個操作系統您正在使用教程?在Linux下使用Swing時,我已經遇到類似的問題,Gnome作爲窗口管理器。這實際上是一個Java錯誤。 – 2010-08-30 15:52:57

+0

我正在使用Windows – Benny 2010-08-30 16:03:03

回答

1

由於你的問題已經改變,我會添加另一個答案。它看起來像你正在尋找使用CardLayout

您的應用程序的無響應可能是由於重繪/隱藏/取消隱藏面板的某些不正確的邏輯引起的。

這是Oracle的使用它 http://download.oracle.com/javase/tutorial/uiswing/layout/card.html

+0

謝謝你的幫助。我修改了我的代碼來使用CardLayout佈局管理器,而不是自己切換面板,我敢肯定,它更高效。但是,問題仍在發生。我猜測在驗證之前會顯示下一張「卡片」(與表格按鈕一起),這就是爲什麼,如果您點擊瀏覽速度足夠快,下面的窗口就會重新繪製。有任何想法嗎? – Benny 2010-08-31 14:42:45

+0

我再次編輯了這個問題,試圖簡化問題。程序現在只顯示一個單獨的組件,在單擊時打開一個JFileChooser對話框。 – Benny 2010-08-31 15:46:37

+0

所以,這個問題似乎只存在於我的機器上。在運行我的應用程序的其他機器上似乎沒有問題。再次感謝您的幫助,並將CardLayout上的信息提供給我。 – Benny 2010-09-01 21:59:57

1

新增功能:

我目前在Mac上,但看不到問題,今天晚些時候我在PC後再試一次。


原貼:

聽起來像一個事件調度線程的問題。確保你在事件派發線程中做了任何操縱GUI的事情。

http://download.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

任何長時間運行的任務應該使用其他線程或擺動工人來執行它的功能,否則會導致事情停止響應/鎖定/等。

+0

我不認爲我是,但我可能是錯的。我的長時間運行的任務不會開始,直到點擊幾個屏幕上的按鈕(我使用擺動工作人員執行它們)。它看起來像是在發生,但我不知道如何找到它。 – Benny 2010-08-30 16:25:57

+0

@Benny:你可以使用'SwingUtilities.isEventDispatchThread()',http://download.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html – trashgod 2010-08-30 16:54:20

+0

我已經檢查了我的應用程序,我一直無法找到任何我在修改事件派發線程之外的GUI的地方。 – Benny 2010-08-30 20:27:11