Java Swing JFrame尺寸返回比屏幕更大的维度

8

在调查我的应用程序的一些问题时,我发现了一些奇怪的事情。

基本上,这个SSCCE应该演示出这个问题:

public class MainFrame extends JFrame {
    public MainFrame() {
         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
         setExtendedState(JFrame.MAXIMIZED_BOTH);
         pack();
    }
}

public class Main {
    public static void main(String[] args) {
        MainFrame mf = new MainFrame();
        mf.setVisible(true);
        System.out.println(mf.getSize());
    }
}

在我的1280x1024分辨率的显示器上,结果是:

java.awt.Dimension[width=1296,height=1010]

有人知道这是怎么回事吗?特别是宽度高于应有的宽度。

谢谢。


java.awt.Dimension[width=1296,height=1000] 在这里。 :) 你的操作系统是什么? - Branislav Lazic
Windows Vista 64位,但如果它说width=1296也是错误的,对吧? - skiwi
你的显示器是什么? - Jean Waghetti
2个回答

9
窗口边框可能有8像素宽。当最大化时,Windows 会调整窗口大小,使客户区域变为1280像素宽。然后窗口的整个宽度为8+1280+8像素=1296像素。高度也是同样的情况。
在使用多屏扩展桌面时,有时可以注意到当一个窗口在一个屏幕上最大化时,窗口的边框会出现在相邻的屏幕上。

2

不确定发生了什么。如果你只是想根据可用的屏幕空间将你的框架设置为最大尺寸,请尝试以下替代方法:

import java.awt.*;
import javax.swing.*;

public class JFrameExtended
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        Rectangle maxBounds = env.getMaximumWindowBounds();

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setBounds(maxBounds);
        f.setVisible(true);
        System.out.println("Frame size: " + f.getSize());
      }
    });
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接