迟到七年总比没有好,对吧?
这个问题没有提供SSCCE 大概是因为这不是所涉及的所有代码。提供的代码的小片段按原样工作,因此几乎所有以前的答案都在说“对我有用”。所以,问题肯定出在剩下的代码上,没有显示出来。
我们无法确定其余代码的作用,但我怀疑它会尝试保持帧的状态和边界,并在以后恢复该状态和边界,这就是失败的原因。 OP 7 年前没有收到答案,因为他们没有解释实际问题是什么,但是这个问题会被更多人看到,所以这里是:
理论上,持久化帧的状态和边界应该是小菜一碟,但实际上并非如此。
这是GUI应用程序中很常见的问题,基本上是代表程序员的一个常见错误。但是,应该注意的是,各种广泛使用的 GUI 框架(当然还有 Java 世界中的 Swing 和 SWT)以特定的不正当方式运行,这使得它很容易犯错误。
问题开始于这些框架不支持“最大化”事件(呃!),因此您可以检测到您的框架已被最大化的唯一方法是侦听“调整大小”事件。因此,您可能会在“调整大小”事件处理程序中保留框架的状态和尺寸。
由于最大化帧而发生“调整大小”事件后,该问题变得更加复杂,帧边界是 最大化的边界你的框架,这些是无关紧要的,如果你错误地坚持它们,你会在自己的脚上开枪。
因此,解决方案是手动跟踪帧的“正常状态”边界,并仅保留这些边界。这可以通过以下方式完成:
addComponentListener( new ComponentAdapter()
{
@Override public void componentResized( ComponentEvent e )
{
if( (getExtendedState() & MAXIMIZED_HORIZ) == 0 )
normalStateBounds.width = getWidth();
if( (getExtendedState() & MAXIMIZED_VERT) == 0 )
normalStateBounds.height = getHeight();
stateAndOrSizeChanged();
}
@Override public void componentMoved( ComponentEvent e )
{
if( (getExtendedState() & MAXIMIZED_HORIZ) == 0 )
normalStateBounds.x = getX();
if( (getExtendedState() & MAXIMIZED_VERT) == 0 )
normalStateBounds.y = getY();
stateAndOrSizeChanged();
}
} );
...哪里:
-
normalStateBounds 定义为 private final Rectangle normalStateBounds = new Rectangle(); 并包含处于“正常”(即未最小化或最大化)状态时组件的边界
-
stateAndOrSizeChanged() 是处理持久化帧的状态和边界的函数,注意只保留normalStateBounds 而不是getX()、getY()、getWidth() 和getHeight() 返回的值.
从持久化加载状态和边界时,您可以简单地调用setBounds(),然后调用setExtendedState(),并且您应该在调用setVisible( true ) 之前执行此操作,以避免您的帧出现在眨眼之间恢复的可能性在最大化之前。对setBounds() 的调用将设置非最大化边界,对setExtendedState() 的调用可能会最大化您的帧,但如果您随后恢复它,它将采用您设置的非最大化边界。