0

Java の GUI をマウスとキーボードの入力に同時に応答させる必要があります。アクション リスナーのループに何かを追加する必要があることはわかっていますが、適切なアイデアが見つかりませんでした。何か提案をお願いします。

GUI をマウスの動きとクリックに応答させると同時に、マウスがボタンの上にあり、Enter キーを押した場合に押されたキーボード ボタンに応答する必要があります。GUI はキーボードに応答し、マウスの動きのアクションは通常どおり続行されます。 !! .. 問題が解決されることを願っています!

4

3 に答える 3

2

「ループに何かを追加する」必要はありません。MouseListenerGUI 要素 (Frame など) にとを追加KeyListenerし、必要に応じてコールバック メソッドを実装するだけです。

于 2012-09-26T19:23:38.780 に答える
0

ボタン上でマウスに応答してEnterキーを押す動作を取得するには、のようにします。

  • JButtonにアタッチされたキーバインディングを使用して、JButtonがEnterキーに応答できるようにします。
  • 上記を行うときは、定数に関連付けられているInputMapを使用しJComponent.WHEN_IN_FOCUSED_WINDOWて、ボタンが実際に応答するためにフォーカスを持っている必要はなく、フォーカスされたウィンドウにある必要があることを確認してください。
  • もちろん、KeyEvent.VK_ENTERに関連付けられたKeyStrokeにバインドします。
  • キーバインディングアクションで、モデルを呼び出して、ボタンのモデルがロールオーバー状態にあるかどうかを確認しますisRollOver()
  • もしそうなら、応答します。
  • 代わりにButtonModelのisRollOverを使用しているため、上記のいずれもMouseListenerを必要としないことに注意してください。

例として、私の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 に答える
0

Toolkit.addAWTEventLstenerを見てください。

これにより、イベント キューを流れるすべてのイベントを監視できます。

問題は、効果の範囲内にあるコンポーネントを特定し、コンポーネントのデフォルトの動作を克服することです (テキスト フィールドにフォーカスがあるときに Enter キーを押すと、そのフィールドでアクション イベントがトリガーされますが、別のことをしたい場合) )

于 2012-09-26T20:01:29.043 に答える