3

JTextAreaコンポーネントのキーバインディングを作成しました。呼び出されると、それ自体の新しいインスタンスが作成され、それにフォーカスが設定されます。

Enterキー(キーバインディングを呼び出す)を押したままにすると、私のプログラムはJTextAreaインスタンスの束を吐き出し始めます。

ユーザーにEnterキーをもう一度押して新しいインスタンスを作成するように強制する方法はありますか?

KeyListenersに切り替える必要がありますか、それともキーバインディングを使用する方法はありますか?

4

3 に答える 3

4

KeyStroke入力マップを設定するときに、キーを離したときにのみ起動するように指定します

KeyStroke getKeyStroke(int keyCode、int修飾子、boolean onKeyRelease)を参照してください。

于 2012-08-31T22:29:46.147 に答える
2

キーバインディングを使用してこれを行う方法は、次の2つのアクションを実行することです。

  • コンポーネントを作成するアクションは、押されたEnterにバインドされ、コンポーネントを挿入するときにそれ自体を無効にします
  • アクションを再度有効にするアクションは、リリースされたEnterにバインドされます

いくつかのコード:

// the action to create the component
public static class CreateAction extends AbstractAction {

    private Container parent;
    private Action enableAction;

    public CreateAction(Container parent) {
        this.parent = parent;
        enableAction = new EnableAction(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        setEnabled(false);
        Component field = createTextField();
        parent.add(field);
        parent.revalidate();
        field.requestFocus();
    }

    int count;
    private Component createTextField() {
        // just for fun counting the fields we create
        JTextField field = new JTextField("field: " + count++, 20);
        field.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), 
                "createComponent");
        field.getActionMap().put("createComponent", this);
        field.getInputMap().put(KeyStroke.getKeyStroke("released ENTER"), 
                "enableCreation");
        field.getActionMap().put("enableCreation", enableAction);
        return field;
    }

}

// the action that enables another
public static class EnableAction extends AbstractAction {

    Action toEnable;

    public EnableAction(Action toEnable) {
        this.toEnable = toEnable;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        toEnable.setEnabled(true);
    }

}

// usage
final JComponent parent = new JPanel(new MigLayout("wrap"));
// here I'm lazy and let the action create the very first component as well
add.actionPerformed(null);
add.setEnabled(true);

アクションの同じインスタンスがすべてのコンポーネントに登録されているため、どちらにフォーカスがあるかは関係ありません(最終的には作成を再度有効にします)。

于 2012-09-01T08:00:54.037 に答える
0

キーが最初に押されたときにのみアクションを実行するために使用するコードは次のとおりです。

private void registerKeyBindings(final JFrame frame) {
    var inputMap = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    inputMap.put(KeyStroke.getKeyStroke(KeyCode.G.getInputEventCode(), 0, false), "g_down");
    inputMap.put(KeyStroke.getKeyStroke(KeyCode.G.getInputEventCode(), 0, true), "g_up");
    
    frame.getRootPane().getActionMap().put("g_down", new AbstractAction() {
      @Override public void actionPerformed(ActionEvent e) {
        if (gDown) return;
        gDown = true;

        // put your custom key-down-action code here
      }
    });
    frame.getRootPane().getActionMap().put("g_up", new AbstractAction() {
      @Override public void actionPerformed(ActionEvent e) {
        gDown = false;
      }
    });
}
Boolean gDown = false;
于 2021-05-22T14:16:37.027 に答える