2

私のプログラムでは、hte SHIFT+ENTERキーはテキスト領域に新しい行を表示しますが、yがENTERキーの確立された動作を削除すると、プログラムがクラッシュします。それを実行できますか?、SHIFT+ENTERキーの機能を追加し、Enterキーの標準動作を削除します。私の次のコードは、Enterキーの削除動作用です。

public void removeEnterBehavior(){
    KeyStroke enter = KeyStroke.getKeyStroke("ENTER");
    InputMap inputMap = messageTextArea.getInputMap();
    inputMap.put(enter, "none");
}

SHIFT+キーのある改行の場合Enter、私のコードは次のとおりです。

@Override
    public void keyPressed(KeyEvent e) {   
         if(e.getKeyCode() == KeyEvent.VK_ENTER && (e.getModifiers() & InputEvent.SHIFT_MASK) != 0){
             addNewLine();
         }
    }

また、ENTERキーはkeyPressedメソッドのメソッドを呼び出す必要があります

4

3 に答える 3

3

KeyBindingと を混ぜているのはなぜKeyListenerですか?

KeyListener/KeyAdapterを Swing と一緒に使用しないでください。常にKeyBindingを使用する

SHIFT+をリッスンするには、次のようにする必要がありますENTER (キーを離したり、キーを押したりすることができます)

jta.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_DOWN_MASK, true), "Shift+Enter released");
jta.getActionMap().put("Shift+Enter released", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent ae) {
        System.out.println("Shift+Enter released");
    }
});

重要な部分は次のとおりです。

KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_DOWN_MASK, true)

最後の 2 つのパラメーターに注意してください。trueが使用されるため、キーを離しKeybindingたときに追加されますが、キーが押されたときに使用でき、同じ結果が発生します。もう 1 つのパラメータは、いつダウンするかです。falseSHIFT

また、削除するには、押さENTERれたキーでそれを行う必要があります:

KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false);
InputMap inputMap = jta.getInputMap();
inputMap.put(enter, "none");

キーが押さfalseれたときにキーバインドが配置されることを意味する使用に注意してください。

次に例を示します。

public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                JTextArea jta = new JTextArea(20, 20);

                //remove enter pressed
                KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false);
                InputMap inputMap = jta.getInputMap();
                inputMap.put(enter, "none");

                //add shift+enter keybinding can be on pressed or released i.e false or true
                jta.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_DOWN_MASK, true), "Shift+Enter released");
                jta.getActionMap().put("Shift+Enter released", new AbstractAction() {
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        System.out.println("Shift+Enter released");
                    }
                });

                frame.add(jta);

                frame.pack();
                frame.setVisible(true);
            }
        });
    }
于 2013-01-14T18:33:12.297 に答える
1

あなたの問題はkeyPressedのkeyEventIssueに似ていると思います

入力動作を回避するのkeyReleasedではなく、使用する必要があります。keyPressed

上記のリンクで私の回答を確認し、それが役に立たない場合、または問題が異なる場合はお知らせください

于 2013-01-14T12:18:04.217 に答える