OSX Yosemite上的Java窗口大小限制(10.10.5)

时间:2015-08-31 23:26:13

标签: java macos window

我正在尝试从Java应用程序调整窗口大小以跨越8个连接的监视器。所有显示器都是完全相同的戴尔显示器,每个显示器分辨率为2560 X 1600。显示器的布局使得有4个横向和2个向下。这意味着所有8个监视器的总分辨率为10240 X 3200.但是,没有Java应用程序似乎能够扩展到大约4096 X 3200.因为我知道在将系统更新到OSX之前,Java应用程序能够扩展到所有8个监视器,这让我想知道Java是否与OSX没有很好的协作。

有没有人遇到过类似的问题?任何人都知道如何解决它或我是否可以?

以前的调查结果

  • 我知道新操作系统在“系统偏好设置”中有一个选项可以使多显示器显示连续。我已经这样做了。
  • 有一些方法可以在Java中动态获取整个屏幕分辨率,我在之前的StackOverflow上找到了对它的引用。原始文档在java.awt.GraphicsConfiguration上。虽然这似乎能够确定总屏幕分辨率应该是多少,并且尽管我使用setBounds(或setSize)来使应用程序具有该大小,但它将无法工作。我还尝试静态输入所需的尺寸,并没有看到动态的差异。即使是简单的程序也无法在4096 X 3200尺寸之外手动调整大小。 (示例程序代码如下所示。)
  • 我也知道,如果窗口的上边界移动得太靠近监视器的顶部或太靠近上部监视器之间的边界,OSX似乎不希望窗口跨越多个显示器。较低的显示器。发生这种情况时,OSX会自动缩放窗口,使其仅占用一个监视器的高度,窗口位于最近的监视器的顶部。这不仅适用于Java应用程序,而且适用于任何应用程序,而且只是OSX的运行方式。这也意味着尝试启动高于一个屏幕的应用程序也会触发此行为。为了我的目的,这是可以的(即使不是更好);我只是希望能够跨越所有8个显示器,即使我必须手动调整窗口大小。
  • 我认为这个问题仅适用于Java应用程序,这是基于三个独立的Java应用程序(包括下面的示例一个)具有相同问题的事实。但是,机器上的其他应用程序(如Google Chrome)在所有8台显示器上似乎都没有问题。
  • 由于其中一个显示器底部的Dock和另一个显示器顶部的菜单,我可能无法获得3200像素的全高。没关系;我只想尽可能接近10240 X 3200窗口尺寸。 (所以,现在,宽度是真正的问题。)

系统详情 操作系统:OSX Yosemite(10.10.5), 处理器:2X2.26 GHz四核Intel Xeon, 记忆:16 BG, 图形:NVIDIA GeForce GT 120 512 MB

示例Java程序

import javax.swing.*;

class WindowTest extends JFrame {
  public WindowTest() {
    setSize(10240, 3200);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
  }

  public static void main (String[] args) {
    WindowTest w = new WindowTest();
    w.setVisible(true);
  }
}

1 个答案:

答案 0 :(得分:1)

非常有趣的问题,以及不错的SSCCE但我无法测试以下代码,因为我的机器只有一个显示端口,但我希望这可能有所帮助。

setSize(10240, 3200)的调用经常被忽略,javadoc告诉我们

  

该方法更改与几何相关的数据。因此,本机窗口系统可能会忽略此类请求,或者它可能会修改所请求的数据,以便以与桌面设置紧密对应的方式放置和调整Window对象。

相反,我建议使用以下两种方法尝试强制调整大小,然后再调用pack()

setMinimumSize(new Dimension(10240, 3200));
setPreferredSize(new Dimension(10240, 3200));

除此之外,你可以而且应该指定相对于左/最顶部屏幕的JFrame位置,有点像这样:(编辑:更新以反映评论并在需要时添加pack()

import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

class WindowTest extends JFrame
{
    public WindowTest()
    {
        setLocation(0, 0);

        //Set your window to a specific size, we can force this by calling pack() later
        setMinimumSize(new java.awt.Dimension(10240, 3200));
        setPreferredSize(new java.awt.Dimension(10240, 3200));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main (String[] args)
    {
        try
        {
            // Set cross-platform Java L&F (also called "Metal")
        UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        }
        catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException | IllegalAccessException e)
        {
            //Do nothing, the progam will default to automatic system assigned L&F
            System.out.println("Failed to set L&F to \"Metal\": "+e.getMessage());
        }
        WindowTest w = new WindowTest();
        w.setVisible(true);
        //Then try pack() to force your window size, and hopefully ignore OS sizing
        w.pack();
    }
}

这应该达到你想要的帧大小。