【问题标题】:How to escape a Java swing window in fullscreen? [duplicate]如何在全屏模式下转义 Java 摆动窗口? [复制]
【发布时间】:2017-09-04 21:37:52
【问题描述】:

我在 Eclipse 中构建了一个摆动窗口,打开时会进入全屏状态,但是无法关闭全屏。

我尝试过在线研究(我知道类似的主题),但在尝试解决方案时遇到了问题。

这是我的 JFrame

    private void initialize()
    {
    frmCpStats = new JFrame();
    frmCpStats.setTitle("CP Stats");
    Toolkit tk = Toolkit.getDefaultToolkit();
    int x =((int) tk.getScreenSize().getWidth());
    int y =((int) tk.getScreenSize().getHeight());
    frmCpStats.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frmCpStats.setSize(x, y);
    frmCpStats.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frmCpStats.setUndecorated(true);
     KeyStroke k = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
     int w = frmCpStats.WHEN_IN_FOCUSED_WINDOW;
     dialog.getRootPane().registerKeyboardAction(e -> window.dispose(), k, w);
    }     

    public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                StatsDisplay window = new StatsDisplay();
                window.frmCpStats.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    }
    public StatsDisplay() {
        initialize();
    }

Eclipse 用VK_ESCAPEWHEN_IN_FOCUSED_WINDOW 识别错误Cannot be resolved or is not a field,用dialog 识别dialog cannot be resolved。我对 swing 的实际工作原理非常陌生,所以我完全不知道为什么会出现这些错误。

【问题讨论】:

  • 请发布有效的minimal reproducible example 并附上您的问题,我们可以编译、运行和测试代码。问题:您是否导入了正确的 KeyEvent 类,特别是 java.awt.event.KeyEvent
  • 另外,JFrame 不继承自JComponent,因此它没有JComponent 常量,例如WHEN_IN_FOCUSED_WINDOW。但你应该在来这里之前检查 API 是否有类似的东西,不是吗?
  • 我使用的是org.eclipse.swt.events.KeyEvent,使用awt 似乎已经清除了VK_ESCAPE 位的任何问题。我对 Java 不是很了解,我不得不有点盲目地工作。
  • API 是你的朋友——你会想用它到筋疲力尽的。
  • 不要盲目复制代码。这不是你学习编码的方式,也不是你在这个网站上提问的方式。

标签: java eclipse swing fullscreen


【解决方案1】:

你快到了。键绑定适用于这种情况。请注意我的 MCVE:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class StatsDisplay {
    private JFrame frmCpStats;

    private void initialize() {
        frmCpStats = new JFrame();

        JPanel contentPane = (JPanel) frmCpStats.getContentPane();           
        int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
        InputMap inputMap = contentPane.getInputMap(condition);
        ActionMap actionMap = contentPane.getActionMap();

        KeyStroke escapeStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);

        inputMap.put(escapeStroke, escapeStroke.toString());
        actionMap.put(escapeStroke.toString(), new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                frmCpStats.dispose();
            }
        });

        frmCpStats.setTitle("CP Stats");
        Toolkit tk = Toolkit.getDefaultToolkit();
        int x = ((int) tk.getScreenSize().getWidth());
        int y = ((int) tk.getScreenSize().getHeight());
        frmCpStats.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frmCpStats.setSize(x, y);
        frmCpStats.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmCpStats.setUndecorated(true);
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    StatsDisplay window = new StatsDisplay();
                    window.frmCpStats.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

    }

    public StatsDisplay() {
        initialize();
    }
}

好奇你为什么要调用window.dispose(),而它实际上是你想要处理的frmCpStats JFrame??

【讨论】:

  • 谢谢,这几乎是我需要的,但是当我按下退出键时,窗口会关闭,而不是简单地退出全屏。
  • @R.McGuigan:但您的代码在其操作中调用dispose()???
  • @R.McGuigan:然后更改该代码以更改窗口的状态。您正在使用从未声明过的变量,进行您不想做的调用....我想我知道发生了什么-您正在尝试复制找到的代码并使用它而不考虑它的作用.请不要这样做,当然永远不要用这种类型的代码提出问题。而是复制想法,但编写自己的有意义的代码。
  • 对不起,我对 Java 函数的了解还很初级,很抱歉浪费您的时间来回答我不专业的回答/问题
【解决方案2】:

删除这些代码行

frmCpStats.setExtendedState(JFrame.MAXIMIZED_BOTH);
frmCpStats.setUndecorated(true);

【讨论】:

  • 根本没有回答主要问题
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多