【问题标题】:Where is the full-screen window event in Java (Awt)?Java(Awt)中的全屏窗口事件在哪里?
【发布时间】:2025-12-19 08:20:16
【问题描述】:

我已经检查了 WindowListener 接口的方法,但它没有为此或调整窗口大小的事件。 (实际上有一个从 Component 类继承的 resized 事件:(link) 但仅此而已。如果用户触发全屏或离开它,有人可以告诉我如何做某事吗?

//全屏是指最大化:))

【问题讨论】:

    标签: java swing events window awt


    【解决方案1】:

    您可以添加一个新的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,因为这些是窗口边框的偏移量。但是,如果您将使用未装饰的窗口,那么您不应该减去我认为。

    希望对你有帮助。

    【讨论】:

    • 而不是检查组件大小(我怀疑是内容窗格或类似的东西,因此您需要考虑边框),如果框架检查 Frame.getExtendedState() 可能更可靠被最大化;这样装饰就不重要了。
    • 我们把那个检查机制放在哪里了?它在componentresized事件下吗?还是在 windowsstatechanged 事件中?
    【解决方案2】:

    如果“触发全屏”是指最大化窗口,则不应使用 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.");
                }
            }
        });
    

    如果“触发全屏”是指真正的full-screen 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”之后添加我自己的代码来详细说明您的意思,我必须覆盖什么?
    • 真正的全屏模式不是用户可以直接实现的;您需要提供用户可以按下的按钮、菜单项等,并且您自己的代码需要显式调用 Java 的 setFullScreenWindow 方法。用更多细节更新了我的答案。
    • 是的,抱歉,我只希望用户最大化它。我不能成为第一个混淆这两者的人..