在JavaGUI中同时从鼠标和键盘获取输入

在JavaGUI中同时从鼠标和键盘获取输入,java,user-interface,mouseevent,actionlistener,keyboard-events,Java,User Interface,Mouseevent,Actionlistener,Keyboard Events,我需要让java中的GUI同时响应鼠标和键盘输入。。我知道我应该在action listener的循环中添加一些内容。。但是没有找到正确的想法。。有什么建议吗 我需要让我的GUI响应鼠标移动和单击,同时响应键盘按钮按下,如果鼠标位于按钮上方并按下enter。。GUI将响应键盘,鼠标运动动作将正常继续。。希望问题解决 您不必“在循环中添加内容”。您只需将MouseListener和keystener添加到GUI元素(例如框架)中,并根据需要实现回调方法 看看,看看 这将允许您监视事件队列中的所有事

我需要让java中的GUI同时响应鼠标和键盘输入。。我知道我应该在action listener的循环中添加一些内容。。但是没有找到正确的想法。。有什么建议吗

我需要让我的GUI响应鼠标移动和单击,同时响应键盘按钮按下,如果鼠标位于按钮上方并按下enter。。GUI将响应键盘,鼠标运动动作将正常继续。。希望问题解决

您不必“在循环中添加内容”。您只需将
MouseListener
keystener
添加到GUI元素(例如框架)中,并根据需要实现回调方法

看看,看看

这将允许您监视事件队列中的所有事件


您将遇到的问题是识别有效区域中的组件并克服组件的默认行为(在文本字段具有焦点时按enter键将触发其上的操作事件,但现在您想做其他事情)

要获得鼠标悬停在按钮上并输入被按下时的响应行为,我将:

  • 使用附加到JButton的键绑定允许它响应enter键
  • 确保在执行上述操作时,使用与
    JComponent.when_IN_FOCUSED_WINDOW
    相关联的InputMap,以使按钮实际上不必具有焦点才能响应,而需要位于焦点窗口中
  • 当然,绑定到与KeyEvent.VK_ENTER关联的击键
  • 在键绑定操作中,通过调用模型上的
    isRollOver()
    检查按钮的模型是否处于滚动状态
  • 如果是的话,请回答
  • 请注意,以上这些都不需要鼠标侦听器,因为我使用ButtonModel的isRollOver来代替鼠标侦听器
例如,我的SSCCE:

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

import javax.swing.*;

public class MouseKeyResponse extends JPanel {
   private JButton button = new JButton("Button");

   public MouseKeyResponse() {
      button.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            System.out.println("button clicked");
         }
      });
      add(button);

      setUpKeyBindings(button);
   }

   private void setUpKeyBindings(JComponent component) {
      int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
      InputMap inputMap = component.getInputMap(condition);
      ActionMap actionMap = component.getActionMap();

      String enter = "enter";
      inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), enter);
      actionMap.put(enter, new EnterAction());
   }

   private class EnterAction extends AbstractAction {
      @Override
      public void actionPerformed(ActionEvent evt) {
         if (button.isEnabled() && button.getModel().isRollover()) {
            System.out.println("Enter pressed while button rolled over");
            button.doClick();
         }
      }
   }

   private static void createAndShowGui() {
      MouseKeyResponse mainPanel = new MouseKeyResponse();

      JFrame frame = new JFrame("MouseKeyResponse");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

“我知道我应该在动作侦听器的循环中添加一些内容”
:什么循环?为什么这句话让我紧张?请详细说明你的问题。假设我们不知道你的程序看起来像什么或正在做什么。再说一遍,你被困在哪里了?你在引出什么行为方面有困难?现在的问题是,当鼠标悬停在组件上并按下enter键时,您需要某种响应吗?如果不是这样,那又怎样?具体问题很重要。再说一遍,你所说的“动作监听器中的循环”是什么意思?再一次,假设我们还没有看到你的代码,我们不能读懂你的思想。问你的问题就像你希望别人问你同样的问题一样,如果你看不到他们的代码或者事先不知道他们想做什么。我需要的是一个想法,而不是解决某个代码问题的方法!!关于循环。。我认为鼠标运动需要一个循环,键盘鹳需要另一个循环,我应该以一种方便的方式合并这两个循环。。。。但我认为这甚至不是一个有效的想法!!。不,这里没有回旋的地方。再说一遍,你有什么想法?你到底被卡在哪一步?Alex的“想法”怎么会没有帮助呢?通常最好不要使用带有Swing GUI的键侦听器,而是使用键绑定。这就是Swing GUI组件本身处理键盘输入的方式。谢谢,但我已经知道这些事情,并且已经做到了。。我编辑了这个问题。。希望编辑后问题会得到解决。@dawn:只要您的程序能够存储,并且能够回忆鼠标和键盘的状态,并对状态的变化做出反应,他的建议就会起作用。他只能给你一般性的建议,因为你还没有提出一个非常一般性的问题。对于更具体的解决方案,您必须提供更具体的信息(正如已经要求的那样)。是否有一个操作侦听器在发生任何一个事件时启动,以简化代码?