Java(Awt)中的全屏窗口事件在哪里?

3
我已经查看了WindowListener接口的方法,但它没有相应的事件来处理窗口大小调整。实际上,在Component类中有一个继承自的resized事件:(链接),但是这仅仅是全部内容...有没有人能告诉我如果用户触发全屏或离开全屏时如何处理?//通过全屏我指最大化:))
2个回答

4
如果“triggers full-screen”指的是最大化窗口,那么你不应该使用ComponentListener。你需要的是WindowStateListener
private static boolean isMaximized(int state) {
    return (state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH;
}

// ...

    frame.addWindowStateListener(new WindowStateListener() {
        public void windowStateChanged(WindowEvent event) {
            boolean isMaximized = isMaximized(event.getNewState());
            boolean wasMaximized = isMaximized(event.getOldState());

            if (isMaximized && !wasMaximized) {
                System.out.println("User maximized window.");
            } else if (wasMaximized && !isMaximized) {
                System.out.println("User unmaximized window.");
            }
        }
    });

如果你所说的“触发全屏”是指一个真正的全屏窗口,那么ComponentListener可能有效,尽管我没有尝试过。由于真正的全屏窗口只有在你的代码调用GraphicsDevice.setFullScreenWindow时才会出现,你可能想在那个调用之后添加你的代码。
if (userPressedFullScreenButton) {
    frame.getGraphicsConfiguration().getDevice().setFullScreenWindow(frame);
    System.out.println("User switched to full-screen.");
} else if (userPressedManagedWindowButton) {
    frame.getGraphicsConfiguration().getDevice().setFullScreenWindow(null);
    System.out.println("User switched out of full-screen.");
}

你能详细说明一下在“GraphicsDevice.setFullScreenWindow”之后添加自己的代码是什么意思吗?我需要覆盖什么内容? - Ryan Marv
真正的全屏模式不是用户可以直接实现的;您需要提供一个按钮、菜单项等,让用户可以按下,然后您自己的代码需要显式调用Java的setFullScreenWindow方法。我已经更新了我的答案,加入了更多细节。 - VGR
是的,抱歉,我只想让用户最大化它。我不能是第一个混淆这两个的人... - Ryan Marv

0
你可以添加一个新的ComponentListener来检测屏幕是否被调整大小,然后你可以匹配新的大小是否等于你的屏幕分辨率大小。 示例
    JFrame frame = new JFrame();

    frame.addComponentListener(new ComponentListener() {

        @Override
        public void componentHidden(ComponentEvent arg0) {}

        @Override
        public void componentMoved(ComponentEvent arg0) {}

        @Override
        public void componentResized(ComponentEvent e) {
            Component c = e.getComponent();

            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            double width = screenSize.getWidth();
            double height = screenSize.getHeight();

            if (width == c.getWidth() - 16 && height == c.getHeight() - 16)
                System.out.println("User entered fullscreen");
        }

        @Override
        public void componentShown(ComponentEvent arg0) {}

    });

解释:

ComponenetListener#componentResized 方法会在用户调整窗口大小时被调用。根据您的问题,您想要检测用户是否进入了全屏模式。

因此,在 componentResized 方法中,我会检查窗口的新宽度和高度是否等于用户的屏幕分辨率。我需要将新的宽度和高度减去 16,因为这是窗口边框的偏移量。但是,如果您使用的是无边框窗口,则不应该进行减法操作。

希望能对您有所帮助。


1
不要检查组件的大小(我怀疑是内容面板或类似的东西,因此您需要考虑边框),最好检查Frame.getExtendedState()是否最大化了;这样装饰就不重要了,更可靠。 - Durandal
我们把那个检查机制放在哪里了?是在组件大小调整事件下面吗?还是在窗口状态更改事件中? - gumuruh

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