目标:
我希望在Frame.MAXIMIZED_BOTH
状态下显示一个框架,但我也希望它具有预定义的正常大小,因此当用户取消最大化时,框架将调整为我想要的大小成为。我希望框架首先显示最大化,没有视觉调整大小。我希望框架保持最大化,直到用户取消最大化。
到目前为止我尝试过的事情:
1)
frame.setExtendedState( Frame.MAXIMIZED_BOTH );
frame.setVisible( true );
frame.setSize( 500, 500 );
评估:框架将切换到正常状态(不会保持最大化)=>不好。
2)
frame.setSize( 500, 500 );
frame.setExtendedState( Frame.MAXIMIZED_BOTH );
frame.setVisible( true );
评估:窗口(或仅其框架)将以500x500的大小显示,之后将显示视觉调整大小(至最大值)=>不好。
这样做的原因是,如果框架不可见,则调用setExtendedState()
将推迟到框架可见。
第3)
frame.setSize( 500, 500 );
frame.setVisible( true );
frame.setExtendedState( Frame.MAXIMIZED_BOTH );
评估:就像在尝试#2中一样,框架将具有视觉调整大小=>不好。
4)
我试图在覆盖componentResize()
的帧中添加一个组件侦听器并在那里更改状态。我还尝试添加覆盖windowStateChange()
的窗口状态监听器。我还尝试添加覆盖windowOpened()
的窗口侦听器。
评估:所有导致视觉调整大小就像尝试#2 =>不好。
那么,如果我希望我的框架具有预定义的正常尺寸,但我希望它看起来最大化,我该怎么办?
编辑:编辑整个问题更加清晰,并添加了示例代码(SSCCE)。
答案 0 :(得分:3)
我不确定你的意思,所以我举了一个例子来展示我认为你想要的东西。
基本上使用JFrame
创建setExtendedState(JFrame.MAXIMIZED_BOTH)
,在5000毫秒后,它会将状态更改为JFrame.NORMAL
而不会闪烁。
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class Test {
public Test() {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
private void initComponents() {
final JFrame frame = new JFrame() {
@Override
public Dimension getPreferredSize() {//used for testing purposes so JFrame has a size
return new Dimension(300, 300);
}
};
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
new Timer(5000, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
frame.setExtendedState(JFrame.NORMAL);
}
}).start();
}
}
答案 1 :(得分:2)
对我来说,以下订单有效
setSize(100,100);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);
答案 2 :(得分:1)
您在#2 尝试中接近回答。 setMaximizedBounds()
课程中有JFrame
方法。它由MAXIMIZED_BOTH
extendedState集上的框架使用,以显示具体大小的框架而不会闪烁。什么对我有用:
frame.setLocation(location);
frame.setSize( 500, 500 );
frame.setMaximizedBounds(calculateMaximizedBounds(frame))
frame.setExtendedState( Frame.MAXIMIZED_BOTH );
frame.setVisible( true );
calculateMaximizedBounds()
计算帧的最大边界(谢谢,KO!),具体取决于当前帧的位置和大小 - 如果U有2个以上的监视器,这是非常重要的,特别是如果它们具有不同的维度。
答案 3 :(得分:0)
this.addWindowStateListener(new WindowStateListener() {
@Override
public void windowStateChanged(WindowEvent e) {
if (e.getNewState() == Frame.NORMAL) {
if (getSize().width == 0 || getSize().height == 0) {
setSize(500, 500);
}
}
}
});
答案 4 :(得分:0)
以下代码适合我。我使用了Perzers关于WindowEvent监听器的想法,但是我检查窗口状态是否从最大化改变了,但没有最小化(因此在恢复程序之后恢复完整的先前状态):
setExtendedState(JFrame.MAXIMIZED_BOTH);
this.addWindowStateListener(new WindowStateListener() {
@Override
public void windowStateChanged(WindowEvent e) {
// In Windows10 state 7 is returned if you minimize, usually ICONIFIED should mean the window is minimized, I used JDK1.6 on W10 (don't ask why)..
if (e.getNewState() != JFrame.MAXIMIZED_BOTH && e.getNewState() != 7 && e.getNewState() != JFrame.ICONIFIED) {
setSize(768, 500);
}
}
});
setVisible(true);
我不确定状态7实际上是什么。
更新:在W10中使用JDK1.8 - 这里的状态实际上是" JFrame.ICONIFIED"应该如此。 状态7实际上是" NE_RESIZE_CURSOR"不推荐使用。 https://github.com/tmikolov/word2vec/blob/20c129af10659f7c50e86e3be406df663beff438/word2vec.c#L80