Swing:JFrame 的各种窗体状态详解

为什么会想到说这个问题?

那是因为前几天工作的遇到一个这样的需求:

把一个已经最小化的窗口,在特定的时候自动弹出

那就需要用到一个方法

setExtendedState

那设置什么状态呢,我的前辈们是这样写的:

 

setExtendedState(JFrame.NORMAL );

 

 

 

但是这样就造成一个问题

如果在窗口是先最大化之后,再最小化的

如果在这个时候弹出,会自动变成非最大化的窗口模式

这样会给人一种前后不一致的感觉

 

那怎么样才能做到完美还原呢?

那我们先来看看 java 为窗体定义了几种状态

我们来看一下 Frame 类中的几个常量吧

public static final int NORMAL = 0;

public static final int ICONIFIED = 1;

public static final int MAXIMIZED_HORIZ = 2;

public static final int MAXIMIZED_VERT = 4;

public static final int MAXIMIZED_BOTH = MAXIMIZED_VERT | MAXIMIZED_HORIZ; //6

 

但是仅仅根据这几个常量我们还是无法区分窗体是在窗口模式下最小化的还是在最大化的模式下最小化的啊

 

 

有人可能会想到,那我们重写 setExtendedState 方法把窗体状态自己记录一下,来记录最小化之前的状态

但是事实上,在你点击窗体自带的那几个按钮时,java 并没有调用 setExtendedState 方法来改变窗体的大小

这里直接是由操作系统处理的

 

那怎么办呢?

于是我尝试着打印窗体的不同状态

 

System.out.println(getExtendedState());

 

 

 

我发现了一个有趣的现象

在窗口是先最大化之后,再最小化

这个时候打印出来的状态为:7

 

这时我终于明白 java 的窗体状态机制了

其实它只给出了 4 种基本状态

 

public static final int NORMAL = 0; //二进制 0000

public static final int ICONIFIED = 1; //二进制 0001

public static final int MAXIMIZED_HORIZ = 2; //二进制 0010

public static final int MAXIMIZED_VERT = 4; //二进制 0100


也就是说正常状态不标记

 

最小化时,第一位 = 1

水平最大化时,第二位 = 1

垂直最大化时,第三位 = 1

于是最大化为:第二位与第三位均置 1 = 6

那最大化之后,再最小化:第一位、第二位与第三位均置 1 = 7

 

这下解决方案就呼之欲出了

我最终把前辈们的代码改成了这样:

 

			int state = getExtendedState();
			if ((state & JFrame.ICONIFIED) == JFrame.ICONIFIED) {
				state = state - JFrame.ICONIFIED;
				setExtendedState(state);
			}


这种终于做到了完美还原

 

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值