0

我需要让java中的GUI同时响应鼠标和键盘输入。我知道我应该在动作监听器的循环中添加一些东西..但没有找到正确的想法..有什么建议吗?

我需要让我的 GUI 响应鼠标运动和点击,同时响应按下的键盘按钮,如果鼠标悬停在按钮上并按下 enter .. GUI 将响应键盘并且鼠标运动动作将正常继续!!..希望问题得到解决!

4

3 回答 3

2

您不必“在循环中添加一些东西”。您只需添加MouseListenerKeyListener到您的 GUI 元素(例如 Frame)并根据需要实现回调方法。

于 2012-09-26T19:23:38.780 回答
0

看看Toolkit.addAWTEventLsener

这将允许您监视流经事件队列的所有事件。

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

于 2012-09-26T20:01:29.043 回答
0

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

  • 使用附加到 JButton 的键绑定以允许它响应回车键。
  • 确保在执行上述操作时使用与JComponent.WHEN_IN_FOCUSED_WINDOW常量关联的 InputMap,以便按钮实际上不必具有焦点来响应,但需要位于焦点窗口中。
  • 当然绑定到与 KeyEvent.VK_ENTER 关联的 KeyStroke。
  • 在键绑定操作中,通过调用模型检查按钮的模型是否处于翻转状态isRollOver()
  • 如果是,请回复。
  • 请注意,以上这些都不需要 MouseListener,因为我使用的是 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();
         }
      });
   }
}
于 2012-09-26T20:50:38.183 回答