每次在寫 button 的 actionPerformed 時,經常會遇到一個問題,就是為了取得 JFrame instance 而煩惱。因為 actionPerformed 通常位於 ActionListener 內,而 ActionListener 通常是一個 inner class,透過 button 的 addActionListener 加入。此時為了控制一些 JFrame 內的元件,經常需要取得 JFrame 的 instance 才可以。當然,傳遞 window event 也是一種應用。

最簡單的方式就是透過 ActionEvent.getSource() 先取得 JButton 的 instance,再利用 SwingUtilities.windowForComponent 找出 JButton 所屬的 Window instance 即可。

cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Window window = SwingUtilities.windowForComponent((Component) e.getSource()); if (window != null) window.dispatchEvent( new WindowEvent(window, WindowEvent.WINDOW_CLOSING)); } });

另一種方式就是透過 Window.getWindows 取得所有 window instance,再檢查那一個 window.isFocused 就可以了,因為你去按一個 button 時,它就會取得 focus,相對的 window 也會取得 focus。

cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Window windows[] = Window.getWindows(); for (Window window : windows) { System.out.println(window); if (window.isFocused()) window.dispatchEvent( new WindowEvent(window, WindowEvent.WINDOW_CLOSING)); } } });

利用上面的程式碼也可以做些變化,比如要針對其它 window 發 event 時,只要把 window.isFocused 改成 window instanceof ClassName 即可。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()