Java 当JFrame处于全屏状态时显示标题栏并不';行不通

Java 当JFrame处于全屏状态时显示标题栏并不';行不通,java,swing,jframe,Java,Swing,Jframe,我刚刚编写了一个程序,在全屏模式下显示JFrame,而不显示标题栏。然而,这使得JFrame难以关闭。(用户必须按Alt+F4才能执行此操作)。我想要的是,当用户将鼠标移动到离JFrame顶部非常近的位置时,标题栏就会出现(比如说,距顶部1个像素)。这与windows 10中的全屏windows功能相同。以下是我尝试过的: import java.awt.Event; import java.awt.Toolkit; import java.awt.event.MouseEvent; impor

我刚刚编写了一个程序,在全屏模式下显示
JFrame
,而不显示标题栏。然而,这使得
JFrame
难以关闭。(用户必须按
Alt
+
F4
才能执行此操作)。我想要的是,当用户将鼠标移动到离
JFrame
顶部非常近的位置时,标题栏就会出现(比如说,距顶部1个像素)。这与windows 10中的全屏windows功能相同。以下是我尝试过的:

import java.awt.Event;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

public class fullscreen_test extends JFrame implements MouseMotionListener{
    public fullscreen_test() {
        this.setUndecorated(true); //remove title bar
        this.setAlwaysOnTop(true); //always on top!!!
        this.setResizable(false); //unresizable
        this.setVisible(true);
        int xsize =(int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        int ysize = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        this.setSize(xsize, ysize); //set the size equal to the screen size
        this.addMouseMotionListener(this); //mousemotionlistener to show title bar
    }
    public static void main(String[] args) {
        fullscreen_test ft = new fullscreen_test();
    }
    @Override
    public void mouseMoved(MouseEvent e) {
        Object src = e.getSource();
        if (e.getY() <= 1){
            if(src instanceof JFrame){
                ((JFrame) src).setUndecorated(false); //This is where eclipse says the error is.
            }
        }
    }
    public void mouseDragged(MouseEvent arg0) {} // required by the MouseMotionListener interface
}

我完全不明白这个错误是什么。任何帮助都将不胜感激。感谢您的关注。

我认为您必须在更改装饰状态之前处理您的JFrame

尝试以下方法:

@Override
public void mouseMoved(MouseEvent e) {
    Object src = e.getSource();
    if (e.getY() <= 1){
        if(src instanceof JFrame){
            JFrame frame = (JFrame) src;
            frame.dispose();
            frame.setUndecorated(false);
            frame.setVisible(true);
        }
    }
}
@覆盖
public void mouseMoved(MouseEvent e){
对象src=e.getSource();

如果(e.getY()我认为您必须在更改装饰状态之前处理JFrame

尝试以下方法:

@Override
public void mouseMoved(MouseEvent e) {
    Object src = e.getSource();
    if (e.getY() <= 1){
        if(src instanceof JFrame){
            JFrame frame = (JFrame) src;
            frame.dispose();
            frame.setUndecorated(false);
            frame.setVisible(true);
        }
    }
}
@覆盖
public void mouseMoved(MouseEvent e){
对象src=e.getSource();
如果(e.getY()作为状态:

只能在帧不可显示时调用此方法

稍后在同一文档中:

抛出:
非法组件状态异常
-如果框架可显示

因此,根本无法在可见的未装饰窗口上显示本机标题栏

但是……您可以显示“假”标题栏,该标题栏由跨平台外观提供:

((JFrame) src).getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
这是通过外观而不是本机桌面系统完成的,因此不需要重新创建本机窗口。缺点是标题栏与本机标题栏不完全相同。

如下所述:

只能在帧不可显示时调用此方法

稍后在同一文档中:

抛出:
非法组件状态异常
-如果框架可显示

因此,根本无法在可见的未装饰窗口上显示本机标题栏

但是……您可以显示“假”标题栏,该标题栏由跨平台外观提供:

((JFrame) src).getRootPane().setWindowDecorationStyle(JRootPane.FRAME);

这是通过外观而不是本机桌面系统完成的,因此不需要重新创建本机窗口。缺点是标题栏与本机标题栏不完全相同。

实现自己的“关闭”可能更容易当用户移动到顶部时显示的图标。可以很好地解释这一点。可以更容易地实现用户移动到顶部时显示的“关闭”图标。可以很好地解释这一点。谢谢。此解决方案效果很好,只是它有一个可怕的(不要介意形容词)JFrame中的更改。JFrame突然消失,露出下面的桌面屏幕,然后与标题栏一起重新显示。非常感谢!不客气!如果您唯一的用例是退出窗口,那么我建议您实现自定义关闭按钮。(如@Steve Smith建议的)如果你认为这回答了你的问题,那么就接受它,否则就尖锐化你原来的问题……非常感谢!史蒂夫·史密斯“实现我自己的关闭按钮”是什么意思?我应该创建自己的关闭按钮并将其放在顶部吗?好的,这让我也可以创建最大化和最小化按钮。谢谢。这个解决方案效果很好,只是它有一个可怕的(不要介意形容词)JFrame中的更改。JFrame突然消失,露出下面的桌面屏幕,然后与标题栏一起重新显示。非常感谢!不客气!如果您唯一的用例是退出窗口,那么我建议您实现自定义关闭按钮。(如@Steve Smith建议的)如果你认为这回答了你的问题,那么就接受它,或者以其他方式尖锐化你原来的问题……非常感谢你。@Steve Smith“实现我自己的关闭按钮”是什么意思?我应该创建我自己的关闭按钮并将其放在顶部吗?好吧,这让我也可以创建最大化和最小化按钮。