【发布时间】:2025-12-19 08:20:16
【问题描述】:
我已经检查了 WindowListener 接口的方法,但它没有为此或调整窗口大小的事件。 (实际上有一个从 Component 类继承的 resized 事件:(link) 但仅此而已。如果用户触发全屏或离开它,有人可以告诉我如何做某事吗?
//全屏是指最大化:))
【问题讨论】:
标签: java swing events window awt
我已经检查了 WindowListener 接口的方法,但它没有为此或调整窗口大小的事件。 (实际上有一个从 Component 类继承的 resized 事件:(link) 但仅此而已。如果用户触发全屏或离开它,有人可以告诉我如何做某事吗?
//全屏是指最大化:))
【问题讨论】:
标签: java swing events window awt
您可以添加一个新的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,因为这些是窗口边框的偏移量。但是,如果您将使用未装饰的窗口,那么您不应该减去我认为。
希望对你有帮助。
【讨论】:
如果“触发全屏”是指最大化窗口,则不应使用 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.");
}
【讨论】: