【问题标题】:Java keyListenerJava keyListener
【发布时间】:2012-08-10 06:23:58
【问题描述】:

我需要一些关于我的 java 代码的帮助我是 java 的新手,我想做的是一旦我按下一个字母我想显示一些消息只是为了验证代码是否有效。使用 javax swing 库特别是 keylistener 和 key event,我不知道我是否做得对。 这是我的代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
public class KeyStrokeButton{
    public JFrame frame;
    public JPanel panel;
    public JButton btnfocus, btnrelease, btnwindow, btnancestor;
    public JTextField text;
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {
                KeyStrokeButton mydesign = new KeyStrokeButton();
                mydesign.design();
            }
        });
    }

    public void design()
    {


        panel = new JPanel();
        panel.setLayout(null);

        frame = new JFrame("Keystroke Tutorials");
        frame.getContentPane().add(panel);
        frame.setSize(250, 250);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        btnfocus = new JButton("<html><center>Focus");
        btnfocus.setBounds(10, 10, 90, 80);
        panel.add(btnfocus);
        btnfocus.addKeyListener(new ClickPressed());


        btnrelease = new JButton("Release");
        btnrelease.setBounds(110, 10, 90, 80);
        panel.add(btnrelease);


        btnancestor = new JButton("Ancestor");
        btnancestor.setBounds(10, 100, 90, 80);
        panel.add(btnancestor);


        btnwindow = new JButton("Window");
        btnwindow.setBounds(110, 100, 90, 80);
        panel.add(btnwindow);
    }
    class ClickPressed implements KeyListener
    {
        public void KeyPressed(KeyEvent e)
        {
            //any code.
        }
    }
}

我想尽可能地分离事件的代码,因此我创建了一个类以使其可读。

【问题讨论】:

  • 那么您遇到错误了吗? (如果没有,那么你可能做对了)
  • 我认为您不想将 KeyListener 用于按钮。您可能需要考虑通过 addActionListener 方法将 ActionListener 添加到按钮中。

标签: java swing keylistener keyevent


【解决方案1】:

KeyListener 在此上下文中基于当前焦点。也就是说,关键事件只会传递给当前具有焦点的组件。

因此,例如,您有 3 个按钮。焦点按钮只有在获得焦点时才会收到按键事件。如果任何其他组件有焦点,焦点按钮将不会接收按键事件。

一般来说,KeyListeners 不是一个好主意。你最好使用Key Bindings API

更好地解释您想要实现的目标将进一步帮助我们。

【讨论】:

    【解决方案2】:

    我不知道您发布的内容中是否存在真正的问题。但从你的代码来看,这里有几个指针:

    我希望这会帮助您入门。

    【讨论】:

      【解决方案3】:

      Sujay 的回答将为您提供所需的所有信息,但这里有一个监听关键事件的简单示例。

      您可以通过在启动后添加这个来为您的 JFrame 添加一个全局键侦听器:

      KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
      manager.addKeyEventDispatcher (new MyDispatcher());
      

      然后您需要创建一个关键事件调度程序,并将您的代码添加到其中

         private class MyDispatcher implements KeyEventDispatcher
          {
              @Override
              public boolean dispatchKeyEvent(KeyEvent e)
              {
                  if (e.getKeyCode() == 38) //up key
                  {
                  //Do something when the up key is pressed
                  System.out.println("The up key was pressed");
                  }
                  else if (e.getKeyCode() == 40) //down key
                  {
                      //Do something when the down key is pressed
                      System.out.println("The down key was pressed");
                  }
                  return false;
              }
          }
      

      【讨论】:

      • 键绑定是键监听器的更好替代方案。
      【解决方案4】:

      尝试使用以下代码在 JFrame 中构建 KeyListener:设置代码以便在按下时检测到 enter 和 escape 键。

      import java.awt.event.KeyEvent;
      import java.awt.event.ActionEvent;
      import java.awt.event.KeyListener;
      
      class KeyListener extends JFrame implements KeyListener {
      
      @Override
      public void keyReleased(KeyEvent e) {               // Required for      KeyListener override
      
      }
      @Override
      public void keyTyped(KeyEvent e) {                  // Required for     KeyListener override
      
      }
      }
      public KeyListener() {
      
      addKeyListener(this);        // KeyListener added to JFrame to detect key strokes
      setFocusable(true);          // Ensure JFrame can gain focus
      
      }
      
      public void keyPressed(KeyEvent e) {    // Code to handle when key pressed
      int keyCode = e.getKeyCode();
      switch( keyCode ) { 
      case KeyEvent.VK_ENTER:          // Code to handle when enter key pressed
      
          // ENTER CODE HERE
      
          break;
      case KeyEvent.VK_ESCAPE:        // Code to handle when Escape key pressed
          // ENTER CODE HERE
          break;
      

      } }

      【讨论】:

        猜你喜欢
        • 2013-08-31
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        • 2016-02-08
        • 2016-12-15
        相关资源
        最近更新 更多