我在java中制作游戏,我需要弄清楚如何调整JFrame相对于最大尺寸的大小。在阅读了充满鳗鱼反应的气垫船并且再次播放它之后,我更新了代码。这应该是一个最小的,完整的和可核查的例子:如何调整JFrame相对于最大尺寸的大小
import java.awt.Dimension;
import javax.swing.*;
import java.awt.Toolkit;
import java.lang.reflect.InvocationTargetException;
public class MyFrameTest {
JFrame frame;
public static void main(String[] args) {
new MyFrameTest();
}
public MyFrameTest() {
System.out.println("screenSize: " + Toolkit.getDefaultToolkit().getScreenSize());
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
});
}
catch (Exception e) { System.out.println("invokeAndWait exception: "+e); }
set_size(300,300);
set_size(500,500);
set_size(0,0);
set_size(0,0);
set_size(500,500);
set_size(0,0);
set_size(0,0);
System.exit(0);
}
public void set_size(int width, int height) {
final Dimension d = new Dimension(width, height);
final int w = width;
final int h = height;
try { Thread.sleep(500); } catch (InterruptedException e) { }
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
if (w == 0 && h == 0) {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
} else {
frame.setExtendedState(JFrame.NORMAL);
frame.setSize(d);
}
displaySize(frame, w, h);
}
});
} catch (Exception e) { System.out.println("invokeAndWait exception: "+e); }
}
public void displaySize(JFrame frame, int width, int height) {
Dimension df = frame.getSize();
Dimension dc = frame.getContentPane().getSize();
if (width == 0 && height == 0)
System.out.printf("Size maximized : Frame %4d,%-4d : Content %4d,%-4d\n",
df.width, df.height, dc.width, dc.height);
else
System.out.printf("Size %4d,%-4d : Frame %4d,%-4d : Content %4d,%-4d\n",
width, height, df.width, df.height, dc.width, dc.height);
}
}
我开发在Linux上,这是输出我得到:
screenSize: java.awt.Dimension[width=1920,height=1080]
Size 300,300 : Frame 300,300 : Content 2,1
Size 500,500 : Frame 500,500 : Content 292,270
Size maximized : Frame 500,500 : Content 492,470
Size maximized : Frame 1928,1033 : Content 1920,1003
Size 500,500 : Frame 500,500 : Content 1920,1003
Size maximized : Frame 500,500 : Content 492,470
Size maximized : Frame 1928,1033 : Content 1920,1003
当我将它设置为一个非最大化的大小,框架的大小是正确的,但如果我使它最大化,我第一次检查框架大小时,它显示没有差异。它只是在我第二次设置并查询它时才显示出来。
古怪,如果我连续设置了两次这样的
if (w == 0 && h == 0) {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
} else {
那么它永远不会不管多少次,我把它叫做更新帧大小。如果我连续设置它三次,它就可以工作。也许这是一个切换?
即使是更大的,ContentPane大小滞后于帧大小,这意味着它滞后于两次尝试的最大化大小。
在玩程序时,我设法得到一个在连续运行中随机行为的组合,有时它会立即更新,有时却不会。这让我想,也许在美国东部时间有一个线程计时的事情,也许这是一个懒惰的更新,但增加一个较长的睡眠没有帮助。
在Windows上,输出是:
screenSize: java.awt.Dimension[width=1600,height=900]
Size 300,300 : Frame 300,300 : Content 116,0
Size 500,500 : Frame 500,500 : Content 284,262
Size maximized : Frame 1616,854 : Content 484,462
Size maximized : Frame 1616,854 : Content 1600,816
Size 500,500 : Frame 500,500 : Content 1600,816
Size maximized : Frame 1616,854 : Content 484,462
Size maximized : Frame 1616,854 : Content 1600,816
这里JFrame的大小是正确的,但contentPane中仍然落后框架。
我试过了,但现在的getSize()返回-10和仍然的getPreferredSize返回 – mooncat39
0 @ mooncat39:看上面的例子。请注意,preferredSize与渲染大小无关,并且与添加的组件和使用的布局管理器有关。 –
我也试过,但是我得到了相同的结果: '渲染后' 'Size:java.awt.Dimension [width = -10,height = -30]' – mooncat39