文章目录

  • 前言
  • 一、使用WindowListener
  • 1.WindowListener接口的各个方法
  • 2.使用方法
  • 二、实现操作
  • 1.实现弹出父窗口隐藏子窗口,退出子窗口还原父窗口
  • 2.相关代码



前言

在近期学习中想写一个登录界面,登录界面为父窗口,内部有一个注册按钮,点击后会出现注册界面,个人想实现的效果为点击父窗口注册按钮时,隐藏父窗口,当在子窗口点击“x”退出子窗口时,使父窗口恢复。弹出子窗口时隐藏父窗口,关闭子窗口时父窗口恢复。


一、使用WindowListener

在子窗口的对应类中可以创建一个内部类并实现WindowListener接口

1.WindowListener接口的各个方法

代码如下:

public My WindowListenerinterface extends EventListener {
public void windowActivated(WindowEvent e); //窗体被激活时触发
public void windowOpened(WindowEvent e);//窗体被打开时触发
public void windowIconified(WindowEvent e); // 窗体从正常状态变为最小化状
public void windowDeiconified(WindowEvent e);// 窗体从最小化状态变为正常状
public void windowClosing(WindowEvent e);//窗体将要被关闭时触发
public void windowDeactivated(WindowEvent e);// 窗体不再处于激活状态时触发
public void windowClosed(WindowEvent e);//窗体已经被关闭时触发
}

2.使用方法

代码如下:

import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.awt.event.WindowListener;

import javax.swing.JFrame;

public class WindowListener_Example extends JFrame {

	public static void main(String args[]) {
		WindowListener_Example frame = new WindowListener_Example();
		frame.setVisible(true);
	}

	public WindowListener_Example() {
		super();
		addWindowListener(new MyWindowListener());
		setTitle("捕获其他窗体事件");
		setBounds(100, 100, 500, 375);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}

	private class MyWindowListener implements WindowListener {
		public void windowActivated(WindowEvent e) {
			System.out.println("窗口被激活!");
		}

		public void windowOpened(WindowEvent e) {
			System.out.println("窗口被打开!");
		}

		public void windowIconified(WindowEvent e) {
			System.out.println("窗口被最小化!");
		}

		public void windowDeiconified(WindowEvent e) {
			System.out.println("窗口被非最小化!");
		}

		public void windowClosing(WindowEvent e) {
			System.out.println("窗口将要被关闭!");
		}

		
		public void windowDeactivated(WindowEvent e) {
			System.out.println("窗口不再处于激活状态!");
		}

		public void windowClosed(WindowEvent e) {
			System.out.println("窗口已经被关闭!");
		}
	}
}

二、实现操作

1.实现弹出父窗口隐藏子窗口,退出子窗口还原父窗口

在子窗口的内部类中重写public void windowOpened(WindowEvent e) 方法,比如让父窗口.setVisible(flase)可以实现在子窗口启动瞬间隐藏父窗口,然后重写public void windowClosed(WindowEvent e)方法,加入子窗口.dispose()。(有人会问为什么一个.setVisible(flase)一个.dispose(),两个的区别为前者使窗口不可见,后者为销毁布局资源,使用后者后需要重新new,个人目前所学认为面向使用者注册后直接登陆进行其他操作,可以将其释放,在注册时可以登陆的窗口可暂时设为不可见)。
在父窗口按钮监听器下创建子窗口时我的设置为将子窗口构造方法添加一个JFrame类型参数,在创建时将父窗口对象传入子窗口,然后在子窗口新创建私有一个空的JFrame类型对象,并将传入的父窗口对象给这个空的对象。这样在内部类中就可以使用父窗口对象进行子窗口关闭后可见和子窗口启动时父窗口不可见的操作。


2.相关代码

父窗口类代码(部分)

/*
        *注册按钮及其监听器
         */
        JButton registerButton=new JButton("注册");
        registerButton.setBounds(185,140,80,25);
        registerButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new RegisterGUI(login);
            }
        });
        /*传入的login为父窗口的JFrame对象名*/

子窗口类代码(部分)

private JFrame close;//创建的空的JFrame对象,用于存储传入的父窗口对象
-----------------------------------------------------------------------
/**
             * 使窗口可见时调用.
             *
             * @param e the event to be processed
             */
            @Override
            public void windowOpened(WindowEvent e) {
                close.setVisible(false);//子窗口启动时父窗口不可见
            }
-----------------------------------------------------------------------
/**
             * 关闭窗口时调用。
             *
             * @param e the event to be processed
             */
            @Override
            public void windowClosed(WindowEvent e) {
                RegisterGUI.this.dispose();//子窗口销毁
                close.setVisible(true);//父窗口变可见
            }