Java会导致Windows分屏吗?

41zrol4v  于 2023-10-22  发布在  Windows
关注(0)|答案(2)|浏览(133)

上下文

在Microsoft Windows中,我可以通过使用快捷方式使应用程序的窗口占据显示的一半:

  • 微信扫一扫
  • 下载Win + →

这些快捷方式会导致“分屏”,如下图所示:

我想以同样的方式编程调整JFrame的大小和位置。但是,我不知道如何达到预期的结果。
我以为解决办法是:
1.将框架的宽度设置为屏幕宽度的一半。
1.将框架的高度设置为屏幕高度(减去屏幕高度)。
1.将帧的位置设置为(0,0)。
下面是一个MCVE:

JFrame testFrame = new JFrame();

Rectangle windowBounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
testFrame.setSize(windowBounds.width / 2, windowBounds.height);
testFrame.setLocation((int) windowBounds.getMinX(), (int) windowBounds.getMinY());

testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testFrame.setVisible(true);

这几乎可以工作,但窗口底部和左侧的边距很小:

提问

在Windows计算机上,有没有一种方法可以使用Java或JNI以编程方式分割屏幕?

tcomlyy6

tcomlyy61#

这里有一个解决方法,可以达到[我认为是]您想要的结果。
(Windows 10上的Oracle JDK 21)

  • 最初将JFrame设置为最大化,即占据了整个屏幕。
  • WindowListener添加到JFrame
  • JFrame显示在[计算机]屏幕上时,调整其大小。

(方法windowOpened仅在窗口初始显示时调用一次。

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

public class TstFrame extends WindowAdapter {

    @Override // java.awt.event.WindowAdapter
    public void windowOpened(WindowEvent event) {
        Window window = event.getWindow();
        Dimension dim = window.getSize();
        window.setSize(dim.width / 2, dim.height);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame testFrame = new JFrame();
            testFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
            testFrame.addWindowListener(new TstFrame());
            testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            testFrame.setVisible(true);
        });
    }
}

屏幕截图:

ddrv8njm

ddrv8njm2#

你在一个高度不稳定的地区。根据用户的偏好,边距宽度、边距高度/宽度或其他设置的值可能会有所不同。除非您使用“窗口管理器”功能来定位窗口,否则您将运行具有正确值的彩票。从Java中执行此操作可能需要涉及JNI和正确的Win32 API调用。
所以我尽量避免这种情况。为什么你需要它?如果你的应用程序在退出时保存了窗口的位置和大小,这样下次启动时就可以记住它们,这会有帮助吗?然后,用户仍然可以选择在哪里有窗口,而他不是固定在屏幕的左或右半边。

相关问题