【问题标题】:Close window on pressing of certain key按下某个键时关闭窗口
【发布时间】:2011-08-09 17:28:05
【问题描述】:

我刚开始使用java,不是很好,所以如果你能帮助我,那就太棒了!我正在制作一个Swing 应用程序,并且只想在按下某个键时关闭它。有没有办法做到这一点?

【问题讨论】:

  • 不要使用旧 AWT 解决方案的 KeyListener(我真的应该否决所有这些建议)。 Swing 旨在与键绑定一起使用。
  • 你关心框架装饰中的关闭按钮吗?键侦听器和绑定都显示为here

标签: java swing


【解决方案1】:

与此处的其他 X 答案相反,我建议您不要使用 KeyListener 而是使用键绑定。这是一个更高级别的抽象,可以帮助您避免使用 KeyListener 带来的焦点问题。您可以在此处的 Swing 教程中找到有关键绑定的更多信息:How to use Key Bindings

【讨论】:

    【解决方案2】:

    如果您希望程序在按下某个键后立即做出反应,您可以使用键盘事件和KeyListener 接口。与ActionListenerItemListener 接口不同,KeyListener 接口必须实现三个 方法:

    • void keyPressed(KeyEvent) -- 按键按下时调用的方法

    • void keyReleased(KeyEvent) -- 释放键时调用的方法

    • void keyTyped(KeyEvent) -- 按键被按下和释放后调用的方法

    虽然所有这些方法都必须存在于您的代码中,但您不必在其中包含任何语句。

    调用getKeyChar() 方法来找出按下了哪个键。正如该方法所暗示的,这将作为 char 值返回。但是,此方法仅适用于字母键、数字键和标点键。

    要监视键盘上的任何键,请使用getKeyCode() 方法。这将作为 int 值返回。您可以使用getKeyText() 方法来跟进,将int 值作为参数。这将返回键的实际名称(即 Home、F2 等)。

    您希望仅在按下某个键时关闭窗口。下面是一个示例,说明您将如何做到这一点:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class example extends JFrame implements KeyListener {
        JLabel closeLabel = new JLabel("Press the \"x\" key to close me!");
    
        public example() {
            super("Close me!");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            closeLabel.addKeyListener(this);
            closeLabel.setFocusable(true);
            add(closeLabel);
            pack();
            setVisible(true);
        }
    
        public void keyTyped(KeyEvent input) {
            char key = input.getKeyChar();
            if (key == 'x') System.exit(0);
        }
    
        public void keyPressed(KeyEvent txt) {
            //do nothing
        }
    
        public void keyReleased(KeyEvent txt) {
            //do nothing
        }
    }
    

    【讨论】:

    • 你的方法需要closeLabel 有重点,对吧?如何添加对整个窗口的支持,并且不允许任何控件隐藏按键?
    • @Dilium 您必须为框架中的每个组件添加一个KeyListener。此外,某些组件不可聚焦(例如JLabel)。你必须做someComponent.setFocusable(true);
    • 为了避免焦点问题,不要使用 KeyListener,而是使用键绑定。
    • @Hovercraft Full of Eels +1,但我想为 OP 推荐一些相对简单的东西。
    • -1,这不是一个简单的解决方案。将 KeyListener 添加到每个组件是一个糟糕的解决方案,尤其是随着框架上组件的复杂性和数量的增加。此外,没有理由让标签组件具有焦点,因为其他一些组件将具有焦点。
    【解决方案3】:

    你得看看KeyListener的界面,我建议你看看这种解释清楚swing做事方式的文章here

    【讨论】:

    • +1 由于 Swing 的做事方式与 KeyListener 无关,所以关于 KeyLIstener 的评论是错误的。但是,我确实喜欢使用菜单的 Swing 教程的链接。这是使用键绑定的简单方法,因为创建菜单项会自动为您创建绑定。使用菜单还可以让您自己记录可在您的程序中使用的击键。
    【解决方案4】:

    添加KeyListener 并检查您的键是否被按下。这是有关如何执行此操作的教程。 http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html

    【讨论】:

      【解决方案5】:

      你必须注册一个处理程序来处理你想要反应的摆动组件上的按键。在处理程序上,关闭窗口。

      这是观察者模式 http://www.javaworld.com/javaworld/javaqa/2001-05/04-qa-0525-observer.html

      【讨论】:

        猜你喜欢
        • 2011-06-29
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多