为什么会想到说这个问题?
那是因为前几天工作的遇到一个这样的需求:
把一个已经最小化的窗口,在特定的时候自动弹出
那就需要用到一个方法
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);
}
这种终于做到了完美还原
|