迟到七年总比没有好,对吧?
该问题没有提供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()
可能会最大化您的框架,但如果您随后恢复它,它将假定您设置的非最大化边界。