Java 我可以设置JFrame';最大化时的正常尺寸是多少?
目标: 我想让一个框架在Java 我可以设置JFrame';最大化时的正常尺寸是多少?,java,swing,Java,Swing,目标: 我想让一个框架在frame.MAXIMIZED\u这两种状态下都可见,但我也希望它有一个预定义的正常大小,这样当用户取消最大化时,框架将调整到我想要的大小。我希望帧首先显示为最大化,而不进行视觉调整。我希望帧保持最大化,直到用户取消最大化 到目前为止我尝试过的事情: 1) 评估:帧将切换到正常状态(不会保持最大化)=>不好 2) 评估:窗口(或仅其框架)将以500x500的大小显示,然后可视调整大小(最大值)=>不好。 原因是,如果某个帧不可见,则调用setExtendedState()
frame.MAXIMIZED\u这两种状态下都可见,但我也希望它有一个预定义的正常大小,这样当用户取消最大化时,框架将调整到我想要的大小。我希望帧首先显示为最大化,而不进行视觉调整。我希望帧保持最大化,直到用户取消最大化
到目前为止我尝试过的事情:
1)
评估:帧将切换到正常状态(不会保持最大化)=>不好
2)
评估:窗口(或仅其框架)将以500x500的大小显示,然后可视调整大小(最大值)=>不好。
原因是,如果某个帧不可见,则调用setExtendedState()
将延迟到该帧可见为止
3)
评估:就像在尝试#2中一样,框架的视觉大小=>不好
4)
我尝试将组件侦听器添加到框架覆盖componentResize()
,并在那里更改状态。我还尝试添加一个窗口状态侦听器,覆盖windowStateChange()
。我还尝试添加一个覆盖windowOpened()
的窗口侦听器
评估:所有这些都导致了视觉调整,就像在尝试中一样#2=>不好
所以,如果我希望我的帧具有预定义的正常大小,但我希望它看起来最大化,我该怎么办
编辑:将整个问题编辑得更清楚,并添加了示例代码(SSCCE)。对我来说,以下顺序有效
setSize(100,100);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);
我不知道你的意思,所以我举了一个例子来说明我认为你想要什么
基本上,使用setExtendedState(JFrame.MAXIMIZED\u两者)
创建一个JFrame
,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();
}
}
您的#2尝试接近答案。在JFrame
类中有setMaximizedBounds()
方法。它由MAXIMIZED\u tware
extendedState set上的frame使用,以显示具体尺寸的框架,而不会闪烁。对我有用的是:
frame.setLocation(location);
frame.setSize( 500, 500 );
frame.setMaximizedBounds(calculateMaximizedBounds(frame))
frame.setExtendedState( Frame.MAXIMIZED_BOTH );
frame.setVisible( true );
calculateMaximizedBounds()
根据当前帧位置和大小,计算帧的最大化边界(谢谢,KO!)-如果您有2个以上的监视器,尤其是它们具有不同的尺寸,这一点很重要。下面的代码适合我。我使用了Perzers的WindowEvent监听器思想,但我检查窗口状态是否从最大化更改而不是最小化(因此在恢复程序后,恢复以前的完整状态):
我不确定到底是什么状态
更新:在W10中使用JDK1.8——这里的状态实际上是“JFrame.ICONIFIED”,正如它应该的那样。
状态7实际上是不推荐使用的“重新调整光标大小”。
如果不发布SSCCE,没有任何想法,顺便说一句,JFrame.pack()执行以下操作same@mKorbel调用pack()的结果是相同的:我将看到一个我想要避免的可视窗口调整大小。您是否尝试让EDT睡眠一小段时间并直接调用您的调整大小?虽然可能不管用,但也许值得一试。丑陋的变通办法有时能解决丑陋的问题;)@Zhedar的问题是,我希望帧保持最大化。每当我调用setSize()时,帧将自动从最大化状态切换到正常状态。他说,他有一个可见的JFrame。你的不是。我在问题中写道,我试过这样做,这样做首先窗口(或者可能只是它的框架)将以你设置的大小显示(在你的示例中为100x100),然后它将被最大化。这是一个视觉调整,我想避免。我希望帧保持在最大化状态。我编辑了这个问题,这样事情就更清楚了。“我希望帧保持在最大化状态。”所以我猜您想删除用于演示帧正常大小的计时器?删去那部分。如果我删去了那部分,那么你提出的解决方案已经在我的尝试中列出了。它有一个问题,我将看到一个视觉调整,我想避免。@icza在阅读您的评论等后,我想我理解。尽管在示例代码中有一个大问题是setSize,但绝对不推荐使用。我不在我的电脑旁,但就我所知,你想在创建时将jframe设置为最大化而不出现视觉闪烁吗?正如andrewthompson所说,只需拆下计时器。如果它仍然提供比我更直观的调整大小,t认为它可能停止。但我会确认何时,在我的pcYes附近,我希望在创建时将jframe最大化,但我也希望在用户手动取消最大化时将窗口调整到指定大小。如果省略setSize(),则不会发生这种情况。问题是我从一个最大化的帧开始。当我取消最大化它时,将调用您的侦听器,但是getSize()
将返回宽度和高度都大于0的大小,因此不会调用setSize()
。您可以测试它。此时调用getSize(),它将返回(0,0)。因为您调用frame.setExtendedState(frame.MAXIMIZED_两者),而不是实际调用setSize()。所以帧大小是(0,0),我做了测试。然后getSize()
返回了一个Dimension
,其分辨率接近我的屏幕分辨率。您是否调用过setSize()?不,我没有。我刚刚调用了setExtendedState(MAXIMIZED_两者)
和setVisible(true)
。无论是否包含setMaximizedBounds()
,我都会得到相同的结果(除了当我包含setMaximizedBounds()
时,最大化的大小显然就是我设置的大小)。你的意思是帧一直闪烁吗?是的,与无setMaximizedBounds()
时相同。虽然#2是最接近我想要的,而且它甚至不麻烦。。。但我没有
setSize(100,100);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);
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();
}
}
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);
}
}
}
});
frame.setLocation(location);
frame.setSize( 500, 500 );
frame.setMaximizedBounds(calculateMaximizedBounds(frame))
frame.setExtendedState( Frame.MAXIMIZED_BOTH );
frame.setVisible( true );
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);