我需要设置一个侦听器,每次调用show()
方法来显示窗口时都可以调用该方法。我怎么能这样做?
答案 0 :(得分:6)
您可能对WindowListener
感兴趣。
来自the tutorial, "How to Write Window Listeners":
以下窗口活动或状态可以在窗口事件之前:
- 打开一个窗口 - 第一次显示一个窗口。
- 关闭窗口 - 从屏幕上移除窗口。
- 图标化窗口 - 将窗口缩小为桌面上的图标。
- 取消对窗口的屏蔽 - 将窗口恢复为原始大小。
- 聚焦窗口 - 包含“焦点所有者”的窗口。
- 已激活的窗口(框架或对话框) - 此窗口是聚焦窗口,或拥有聚焦窗口。
- 停用的窗口 - 此窗口失去了焦点。有关焦点的更多信息,请参阅AWT焦点子系统规范。
如果您不想实施所有这些内容,可以使用WindowAdapter
,如下所示:
myFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent we) {
System.out.println("this window was opened for the first time");
}
@Override
public void windowActivated(WindowEvent we) {
System.out.println("this window or a subframe was focused");
}
});
答案 1 :(得分:3)
添加ComponentListener
并检查componentShown
事件。请注意,WindowListener
只会触发第一次窗口打开,而ComponentListener
将触发 每个 时间。
有关详细信息,请参阅How to Write a Component Listener。
此源演示了两个侦听器。
import java.awt.*;
import java.awt.event.*;
import java.util.logging.*;
import javax.swing.*;
import javax.swing.event.*;
class DetectVisibility {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
JPanel gui = new JPanel(new BorderLayout());
final Logger log = Logger.getAnonymousLogger();
ComponentListener cl = new ComponentListener() {
@Override
public void componentResized(ComponentEvent e) {
log.log(Level.INFO, e.toString());
}
@Override
public void componentMoved(ComponentEvent e) {
log.log(Level.INFO, e.toString());
}
@Override
public void componentShown(ComponentEvent e) {
log.log(Level.INFO, e.toString());
}
@Override
public void componentHidden(ComponentEvent e) {
log.log(Level.INFO, e.toString());
}
};
WindowListener we = new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
log.log(Level.INFO, e.toString());
}
@Override
public void windowClosing(WindowEvent e) {
log.log(Level.INFO, e.toString());
}
@Override
public void windowClosed(WindowEvent e) {
log.log(Level.INFO, e.toString());
}
@Override
public void windowIconified(WindowEvent e) {
log.log(Level.INFO, e.toString());
}
@Override
public void windowDeiconified(WindowEvent e) {
log.log(Level.INFO, e.toString());
}
@Override
public void windowActivated(WindowEvent e) {
log.log(Level.INFO, e.toString());
}
@Override
public void windowDeactivated(WindowEvent e) {
log.log(Level.INFO, e.toString());
}
};
final JWindow w = new JWindow();
w.setSize(100,100);
w.setLocation(10,10);
w.addComponentListener(cl);
w.addWindowListener(we);
final JCheckBox show = new JCheckBox("Show Window");
ChangeListener chl = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
w.setVisible(show.isSelected());
}
};
show.addChangeListener(chl);
gui.add(show);
JOptionPane.showMessageDialog(null, gui);
}
};
// Swing GUIs should be created and updated on the EDT
// http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
SwingUtilities.invokeLater(r);
}
}
答案 2 :(得分:2)
有一个名为WindowListener的界面,这是一个在窗口为opened时被触发的事件。您可以在第一个链接中找到所有事件。
编辑:
WindowListener只能运行一次。正如Per @Andrew Thompson所说,我们应该使用ComponentListener。当然最好的答案。