這是一個有趣的問題,在構建最後一個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)之前放置動作偵聽器,那麼一切都按照它應該的方式工作。但是我不能這樣做,因爲事件處理程序要在另一個類中實現。是什麼導致這個問題,我該如何解決它?
'在JDialog的事件處理程序,如果放在調用setVisible(真)'後不工作 - 正確的,因爲JDialog的是模態,因此()的調用setVisible之後的語句直到執行對話框關閉。在對話框可見之前,沒有理由不能將ActionListener添加到按鈕。代碼位於單獨的類中並不重要。您只需在調用setVisible()語句前剛剛發佈的類的構造函數中創建該類的實例。 – camickr
@camickr我看到了,在實現了偵聽器之後,我將setVisible()放在了另一個類中,它似乎正在工作。謝謝你的回答。你介意發佈一個答案,以便我可以解決這個問題嗎? – Aeleon