【问题标题】:Java KeyStroke Problem About Writing Twice关于写两次的 Java KeyStroke 问题
【发布时间】:2020-01-02 18:27:08
【问题描述】:

我使用带有 swing 库的 Java 代码为按钮分配了键盘快捷键。如果我在输入之前单击文本字段,它会写入 2 次。我想写一次。

Java 代码:

    button1 = new JButton("1");
    button1.addActionListener(this);
    button1.setBackground(Color.lightGray);
    //button1 normal number button
    button1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "button1");
    button1.getActionMap().put("button1", new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText() + "1");

        }
    });
    //button1 numpad number button
    button1.getInputMap(button1.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0), "button1");
    button1.getActionMap().put("button1", new AbstractAction() {

        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText() + "1");
        }
    });

public void actionPerformed(ActionEvent actionEvent) {
    if (actionEvent.getActionCommand().equals("1")){
        textField.setText(textField.getText() + "1");
    }
}

sample screenshot

你可以在截图中看到,我在选择文本字段时按了一次按钮 1,但它写了 2 次。

【问题讨论】:

  • 你可以参考这个链接。 stackoverflow.com/questions/30925438/…
  • 请参阅 Calculator Panel 以获取满足您需求的工作示例。将来发布适当的minimal reproducible example 来演示问题。我们无法判断是您发布的代码还是“您未发布的代码”导致了问题。一个合适的 MRE 应该是一个带有 JTextField 和一个 JButton 以及一个键绑定的 JFrame。一旦你得到第一个绑定工作,你添加第二个绑定。
  • 它对我不起作用。我认为我的 gui 与这个不同。

标签: java swing key-bindings


【解决方案1】:

你的最后一个方法看起来多余。

public void actionPerformed(ActionEvent actionEvent) {
if (actionEvent.getActionCommand().equals("1")){
    textField.setText(textField.getText() + "1");
}

【讨论】:

  • 我需要使用此代码,因为我在 GUI 中添加了 0 到 9 个数字按钮。如果我删除代码,它就无法工作。
【解决方案2】:

好的,所以您有一个文本字段和与您的按钮关联的键绑定,因此当您键入时,文本字段和按钮都会执行并更新文本字段。由于您实际上并不需要可编辑文本字段(因为您通过按钮控制它),所以使文本字段不可编辑。

您还为1 按钮附加了两个操作处理程序。如果你删除

button1.addActionListener(this);

您可能会发现问题不再存在

工作示例

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            JTextField field = new JTextField(10);
            field.setEditable(false);
            add(field, BorderLayout.NORTH);

            JPanel pad = new JPanel(new GridLayout(0, 3));

            InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap actionMap = getActionMap();
            for (int index = 0; index < 10; index++) {
                JButton btn = new JButton();
                Action numAction = new NumberAction(field, index);

                btn.setAction(numAction);

                System.out.println(KeyStroke.getKeyStroke("pressed " + index));

                inputMap.put(KeyStroke.getKeyStroke("pressed " + index), "Pressed-" + index);
                actionMap.put("Pressed-" + index, numAction);

                pad.add(btn);
            }

            add(pad);
        }

    }

    public class NumberAction extends AbstractAction {
        private JTextField field;
        private int number;

        public NumberAction(JTextField field, int number) {
            this.field = field;
            this.number = number;

            putValue(NAME, Integer.toString(number));
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            Document doc = field.getDocument();
            try {
                doc.insertString(doc.getLength(), Integer.toString(number), null);
            } catch (BadLocationException ex) {
                ex.printStackTrace();
            }
        }

    }

}

【讨论】:

  • 没用,我想我需要使用这段代码,因为我已经有 0-9 个数字按钮。如果我删除此代码,按钮将不起作用。
  • 我已经发布了一个工作示例,如果你不能发布一个非工作示例,这是任何人都可以帮助你的地方
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2010-10-02
  • 2021-02-15
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多