我需要设置一个监听器,它可以在每次show()
调用方法来显示窗口时调用一个方法。我怎样才能做到这一点?
问问题
6544 次
3 回答
7
你可能会对WindowListener
.
以下窗口活动或状态可以在窗口事件之前:
- 打开一个窗口——第一次显示一个窗口。
- 关闭窗口 — 从屏幕上移除窗口。
- 图标化窗口 — 将窗口缩小为桌面上的图标。
- 取消图标化窗口 — 将窗口恢复到其原始大小。
- 焦点窗口 — 包含“焦点所有者”的窗口。
- 激活的窗口(框架或对话框)——这个窗口要么是焦点窗口,要么拥有焦点窗口。
- 已停用的窗口 - 此窗口已失去焦点。有关焦点的更多信息,请参阅 AWT 焦点子系统规范。
如果您不想实现所有这些,可以使用 a 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");
}
});
于 2013-03-18T04:48:56.667 回答
3
添加ComponentListener
并检查componentShown
事件。请注意, aWindowListener
只会在第一次打开窗口时触发,而每次ComponentListener
都会触发。
有关详细信息,请参阅如何编写组件侦听器。
此源演示了两个侦听器。
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);
}
}
于 2013-03-18T05:43:17.383 回答
2
有一个名为WindowListener的接口,这是一个在打开窗口时触发的事件。您可以在第一个链接中找到所有事件。
编辑 :
WindowListener 只工作一次。根据@Andrew Thompson 的帖子,我们应该使用 ComponentListener。当然是最好的答案。
于 2013-03-18T04:48:59.767 回答