3

次のコードをご覧ください

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class KeyCheck extends JFrame
{
    private JButton check;
    private JPanel panel;
    private FlowLayout flow;

    public KeyCheck()
    {
        check = new JButton("Check");
        check.addKeyListener(new KeyWork());

        panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.add(check);

        getContentPane().add(panel);

    }

    private class KeyWork extends KeyAdapter
    {
        public void keyPressed(KeyEvent k)
        {
            if(k.getKeyCode()==KeyEvent.VK_CONTROL && KeyEvent.VK_A)
            {
                JOptionPane.showMessageDialog(null, "OK");
            }
        }
    }
    public static void main(String[]args)
    {
        KeyCheck k = new KeyCheck();
        k.setVisible(true);
        k.setSize(200,200);
        k.validate();
        k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

この場合、ボタンにキーリスターを追加しました。CTRL+ Aを同時に押したときに「OK」というメッセージを表示するためにキーリスターを追加する必要があります(コントロールキーと「A」キー)。しかし、上記のコードは間違っています。だから、両方のキーが一緒に押されたときにメッセージを受け取るのを手伝ってください。

4

4 に答える 4

5

キーコードと修飾子を混在させています:

 if(k.getKeyCode()==KeyEvent.VK_A 
     && (k.getModifiers & KeyEvent.CTRL_MASK==KeyEvent.CTRL_MASK))

ただし、より一般的には、KeyListenerの代わりにKeyBindingsを使用することをお勧めします。それはあなたの人生をずっと楽にし、あなたがそのような種類のテストをしなければならないことを避けます。

1.次のようなアクションを作成します。

 public class MyAction extends AbstractAction {

     public void actionPerformed(ActionEvent e) {
          JOptionPane.showMessageDialog(null, "OK");
     }
 }

2.アクションをキーストロークにバインドします。

check.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK), "doSomething");
check.getActionMap().put("doSomething", new MyAction());

警告:私はこのコードをテストしていないので、マイナーな不具合を修正する必要があるかもしれません。

于 2012-05-18T15:08:02.540 に答える
1

イベントではメソッドを使用する必要がありますk

if(k.isControlDown() && k.getKeyCode() == KeyEvent.VK_A) {

ただし、これはボタンがフォーカスされている場合にのみ機能することに注意してください。たとえば、に追加JTextFieldしてframe何かを書き込むと、フォーカスされてCtrl+Aいるため機能しません。JTextField

于 2012-05-18T15:07:11.903 に答える
0

        public void keyPressed(KeyEvent k)
        {
            if(k.getKeyCode() == KeyEvent.VK_A && (k.getModifiers & KeyEvent.CTRL_MASK) != 0)
            {
                JOptionPane.showMessageDialog(null, "OK");
            }
        }
    }
于 2012-05-18T15:07:50.810 に答える
0

非常に簡単なキーニーモニックまたはアクセラレータを使用することもできます。1。ニーモニックはメニューを開きます。2。アクセラレータはそれぞれのメニューボタンを押します。

JMenuItem combination = new JMenuItem("Save File");
combination.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
        combination.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == find) {
                System.out.println("Ctrl+S pressed");
savefile();//depending on what your saving code is                    
                }

            }
        });
于 2016-07-16T14:54:15.590 に答える