Java中的窗口事件包括:
1,windowActivated窗口激活(获取焦点)
2,windowDeactivated窗口失活(失去焦点)
3,windowClosed窗口关闭 (dispose方法被显式调用用来释放资源时响应)
4,windowClosing窗口正在关闭(用户试图通过关闭按钮关闭窗口时)
5,windowIconified窗口图标化 (最小化窗口)
6,windowDeiconified窗口取消图标化(从最小化还原窗口)
7,windowOpened窗口打开(窗口首次显示时)
以上七种窗口事件可通过继承WindowAdapter重写需要的方法或者实现WindowListener接口并按需要实现相应的方法即可。由于java不支持多继承,而窗体类一般都须继承自JFrame,所以往往采用第二种方法,即通过实现接口的方法来监测窗口事件。
窗口还有一些比较常用的事件比如 窗口移动(moved),窗口隐藏(hidden或者setVisible(false)),窗口恢复显示(setVisible(true)),窗口尺寸改变(Resized)。这些事件可通过实现ComponentListener接口来进行检测的。 在ComponentListener接口中定义了一下四个方法:
1,componentMoved组件移动
2,componentHidden组件隐藏(每次调用setVisible(false)时响应
3,componentShown组件显示 (可能是第一次也可能不是,每次调用setVisible(true)时响应
4,componentResized组件尺寸改变
以上四个组件事件是针对所有组件的,不仅仅限于窗口
此外,还可通过继承MouseListener来响应鼠标事件
在Swing窗体JFrame中有一个方法可以用来最小化以及还原窗口的方法 -- setState(int state); 或者 setExendedState
jframe.setState(JFrame.ICONIFIED);//最小化窗口
jframe.setState(JFrame.NORMAL);//还原窗口
下面的例子实现了以下功能
两个窗口,一个主窗口,一个副窗口
1,移动主窗口,副窗口会跟着主窗口移动。
2,最小化主窗口,副窗口也最小化;恢复主窗口,副窗口也恢复。
3,检测windowClosing事件,并给出提醒。
4,检测windowClosed事件,输出一句话到控制台。
效果很简单:
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class MainFrame extends JFrame implements ComponentListener,
WindowListener {
public static final int SIZE_X = 400;
public static final int SIZE_Y = 400;
public static final int LOC_X = (Toolkit.getDefaultToolkit()
.getScreenSize().width - SIZE_X) / 2;
public static final int LOC_Y = (Toolkit.getDefaultToolkit()
.getScreenSize().height - SIZE_Y) / 2;
MinorFrame minorFrame;
JButton ShowBtn;
public MainFrame() {
super();
this.minorFrame = new MinorFrame();
setTitle("Main Frame");
setLayout(new FlowLayout());
add(getShowBtn());
addComponentListener(this);
addWindowListener(this);
setBounds(LOC_X, LOC_Y, SIZE_X, SIZE_Y);
setVisible(true);
setResizable(false);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
}
private JButton getShowBtn() {
// TODO Auto-generated method stub
if (ShowBtn == null) {
ShowBtn = new JButton("Show");
}
ShowBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if (!minorFrame.isVisible()) {
minorFrame.setVisible(true);
}
minorFrame.setState(JFrame.NORMAL);
}
});
return ShowBtn;
}
public static void main(String args[]) {
new MainFrame();
}
@Override
public void windowActivated(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Windows Closed!");
}
@Override
public void windowClosing(WindowEvent arg0) {
// TODO Auto-generated method stub
if (JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(this,
"Are you sure to close the window?", "Window Closing...",
JOptionPane.OK_CANCEL_OPTION)) {
minorFrame.dispose();
this.dispose();
// System.exit(0);
}
}
@Override
public void windowDeactivated(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent arg0) {
// TODO Auto-generated method stub
if (minorFrame.isVisible()) {
minorFrame.setState(JFrame.NORMAL);
}
}
@Override
public void windowIconified(WindowEvent arg0) {
// TODO Auto-generated method stub
if (minorFrame.isVisible()) {
minorFrame.setState(JFrame.ICONIFIED);
}
}
@Override
public void windowOpened(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void componentHidden(ComponentEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void componentMoved(ComponentEvent arg0) {
// TODO Auto-generated method stub
Point point = getLocation();
minorFrame.setLocation(point.x + SIZE_X, point.y);
}
@Override
public void componentResized(ComponentEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void componentShown(ComponentEvent arg0) {
// TODO Auto-generated method stub
}
}
class MinorFrame extends JFrame {
public MinorFrame() {
super();
setTitle("Minor Frame");
setSize(250, 400);
setVisible(true);
setResizable(false);
setDefaultCloseOperation(HIDE_ON_CLOSE);
}
}