2015-10-18 228 views
0

這是一個有趣的問題,在構建最後一個JDialog時沒有顯示,即使這個問題比這更復雜。反正這裏是導致問題的代碼。JDialog中的事件處理程序如果放置在setVisible後面時不起作用(true)

public class Test extends JDialog{ 

private final JButton cancel, ok; 
private final JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 50, 5)); 

public Test(JFrame parent) { 
    //Initialize the JDialog 
    super(parent, "Select Chapters"); 
    setLayout(new BorderLayout()); 
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    setModalityType(JDialog.ModalityType.APPLICATION_MODAL); 
    setSize(300, 300); 
    setLocationRelativeTo(null); 


    cancel = new JButton("Cancel"); 
    ok = new JButton("OK"); 
    buttonPanel.add(cancel); 
    buttonPanel.add(ok); 
    getContentPane().add(buttonPanel, BorderLayout.SOUTH); 



    setVisible(true); 

    cancel.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      dispose(); 
     } 
    }); 


}} 

和主要方法

Test test = new Test(new JFrame()); 

我把事件偵聽器在構造函數中進行測試,但實際執行是應該在另一個類的事情發生。這就是爲什麼這是一個問題。如果我在setVisible(true)之前放置動作偵聽器,那麼一切都按照它應該的方式工作。但是我不能這樣做,因爲事件處理程序要在另一個類中實現。是什麼導致這個問題,我該如何解決它?

+1

'在JDialog的事件處理程序,如果放在調用setVisible(真)'後不工作 - 正確的,因爲JDialog的是模態,因此()的調用setVisible之後的語句直到執行對話框關閉。在對話框可見之前,沒有理由不能將ActionListener添加到按鈕。代碼位於單獨的類中並不重要。您只需在調用setVisible()語句前剛剛發佈的類的構造函數中創建該類的實例。 – camickr

+0

@camickr我看到了,在實現了偵聽器之後,我將setVisible()放在了另一個類中,它似乎正在工作。謝謝你的回答。你介意發佈一個答案,以便我可以解決這個問題嗎? – Aeleon

回答

3

事件處理程序不工作如果放在調用setVisible(真)

無誤後,因爲JDialog的是模態,因此不執行()的調用setVisible後聲明,直到對話框關閉。

在對話框變爲可見之前,沒有理由不能將ActionListener添加到按鈕。代碼位於單獨的類中並不重要。您只需在創建按鈕的類的構造函數中創建該類的實例。

我把調用setVisible()中的其他類我實現了聽衆

你還是做錯事之後。 setVisible()應該在您的主類中,您可以在其中設置對話框屬性並創建所有組件並將該組件添加到對話框中。

我不知道你爲什麼這樣做。您的代碼可以是這樣的:

cancel = new JButton("Cancel"); 
cancel.addActionListener(new SomeActionListenerClass()); 
... 
setVisible(true); 
+0

我這樣做的原因是因爲我所有的貴族班都不應該有任何聽衆。我發佈的課程還有其他按鈕;這些按鈕的偵聽器具有需要來自不同包的數據的方法(我正在使用MVC)。因此,我將所有GUI組件的所有動作偵聽器都放在控制器中。這樣我的模型和視圖就完全分離了。 – Aeleon

+0

@Aeleon,'這樣我的模型和視圖就完全分離了。「 - 模型/視圖不應該關於框架。 setVisible()方法不屬於該類。 – camickr

+0

我以爲框架是視圖的一部分。如果setVisible()不屬於控制器,那麼我怎麼才能確保我的監聽器在setVisible()被調用之前執行?測試中設置可見性的方法? – Aeleon

2

您需要將setVisible(true)放置在構造函數的末尾,因爲該對話框是模態對象,在這種情況下,setVisible(true)將在您調用setVisible(false)之前不會返回。

引用Java文檔:https://docs.oracle.com/javase/7/docs/api/java/awt/Dialog.html#setVisible(boolean)爲模態對話框

注意事項。

調用setVisible(真):如果對話框尚不可見,這個調用將 不會返回,直到對話框通過調用調用setVisible(假)或 處置隱藏。

setVisible(false):隱藏對話框,然後返回 setVisible(true)如果它當前被阻止。

可以從事件派發線程調用此方法 ,因爲該工具包確保 在此方法被阻止時其他事件未被阻止。在的JDialog

相關問題