【问题标题】:How can I terminate java program with two keyboard keys?如何用两个键盘键终止 java 程序?
【发布时间】:2020-12-11 17:28:04
【问题描述】:

我正在开发一个关于国家时间的项目。我希望主课结束,同时不断显示按下 Ctrl+X 的时间。我使用了 JFrame。当我只按一个键时,程序就终止了。但我不能用两个键解决这个问题。我尝试了一些在这里找到的解决方案。 KeyPressed 代码和主类如下。这样程序就不会停止。

关键代码:

 public void keyPressed(KeyEvent e) {
        System.out.println("Key Pressed " + KeyEvent.getKeyText(e.getKeyCode()) );
        if("Right".equals(KeyEvent.getKeyText(e.getKeyCode())))
            System.out.println("Right Button Detected");
        if(e.getKeyCode()==KeyEvent.VK_CONTROL && e.getKeyCode()==KeyEvent.VK_X);
            System.exit(0);
    }

主代码:

public class Main {
public static void main(String[] args) {
    System.out.println("You enter CTRL X to exit the program.");

    MyKeyListener klavye = new MyKeyListener();
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.addKeyListener(klavye);
    frame.setVisible(true);
}

【问题讨论】:

    标签: java swing jframe


    【解决方案1】:

    改为Use Key Bindings 看看KeyListener vs KeyBinding

    public class KeybindingTest {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                JPanel contentPane = new JPanel(new FlowLayout());
                contentPane.add(new JLabel("Press CTRL+X to exit."));
    
                contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                    .put(KeyStroke.getKeyStroke("control X"), "exit");
                
                contentPane.getActionMap().put("exit", new AbstractAction() {
    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
                    }
                });
                
                frame.setContentPane(contentPane);
    
                frame.pack();
                frame.setLocationByPlatform(true);
                frame.setVisible(true);
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

      我不知道这是否适合你:

      public void keyPressed(KeyEvent kevt) {
       if(kevt.getKeyChar()=='X') {
        if(kevt.isAltDown())
        //Code if Alt+x pressed
        if(kevt.isControlDown())
        //Code if Ctrl+x pressed
        if(kevt.isShiftDown())
        //Code if Shift+x pressed
        if(kevt.isAltDown()&&kevt.isControlDown()&&(!kevt.isShiftDown()))
        //Code if Alt+Ctrl+x pressed
        if(kevt.isAltDown()&&kevt.isShiftDown()&&(!kevt.isControlDown()))
        //Code if Alt+Shift+x pressed
        if(!(kevt.isAltDown())&&kevt.isControlDown()&&(kevt.isShiftDown()))
        //Code if Shift+Ctrl+x pressed
        if(kevt.isAltDown()&&kevt.isControlDown()&&kevt.isShiftDown())
        //Code if Alt+Ctrl+Shift+x pressed
      }
      

      我认为这段代码应该很容易理解

      【讨论】:

        【解决方案3】:

        有了Eminent Emperor Penguin的回答,我用下面的代码解决了我的问题:

               @Override
            public void keyPressed(KeyEvent e) {
        
                if (e.isControlDown()){
                    System.out.println("PRESSED CTRL.");
        
                }
                if (e.getKeyCode()==KeyEvent.VK_X){
                    System.out.println("PRESSED X.");
                }
                if (e.isControlDown() && e.getKeyCode()==KeyEvent.VK_X){
                    System.out.println("PRESSED BOTH.");
                    System.exit(0);
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-29
          • 2013-02-09
          • 1970-01-01
          • 2014-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多