java - 如何让按钮按下某个键?

标签 java swing

我想知道是否可以在 JButton Press a key 中制作一个按钮?

例如,如果我有一个名为“新建按钮”的按钮,我用鼠标单击它。我希望它按我的左箭头键。

还有可能让它一直按下直到我松开鼠标吗?所以或多或少我点击它,它会连续按下我的左箭头键,直到我释放鼠标然后它停止?

最佳答案

I click it and It presses my left arrow key continuously until I release the mouse then it stops?

这有什么意义呢?

如果您使用键盘按向左箭头,则 KeyStroke 将分派(dispatch)到具有焦点的组件。因此,如果焦点位于文本字段上,则向左箭头会将插入符号向后移动一个字符。

如果您单击某个按钮,焦点现在位于该按钮上,如果您向该按钮发送向左箭头,则不会发生任何事情。

也许您正在尝试使用向左箭头键来执行某种动画。如果是这样,那么您需要创建一个Action。然后您需要添加代码,以便单击按钮或按下左箭头键可以调用此操作。

有关此方法的基本概念,您可以阅读 Swing Tutorial 。有以下部分:

  1. 如何使用操作
  2. 如何使用按键绑定(bind)

有关此方法的工作示例,您可以查看 Motion Using the KeyboardMotionWithKeyBindings.java 代码使用键盘或按钮执行动画。

你想做这样的事情吗?这是一个简单的“计算器”键盘:

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

public class CalculatorPanel extends JPanel
{
    private JTextField display;

    public CalculatorPanel()
    {
        Action numberAction = new AbstractAction()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
//              display.setCaretPosition( display.getDocument().getLength() );
                display.replaceSelection(e.getActionCommand());
            }
        };

        setLayout( new BorderLayout() );

        display = new JTextField();
        display.setEditable( false );
        display.setHorizontalAlignment(JTextField.RIGHT);
        add(display, BorderLayout.NORTH);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout( new GridLayout(0, 5) );
        add(buttonPanel, BorderLayout.CENTER);

        for (int i = 0; i < 10; i++)
        {
            String text = String.valueOf(i);
            JButton button = new JButton( text );
            button.addActionListener( numberAction );
            button.setBorder( new LineBorder(Color.BLACK) );
            button.setPreferredSize( new Dimension(50, 50) );
            buttonPanel.add( button );

            InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
            inputMap.put(KeyStroke.getKeyStroke(text), text);
            inputMap.put(KeyStroke.getKeyStroke("NUMPAD" + text), text);
            button.getActionMap().put(text, numberAction);
        }
    }

    private static void createAndShowUI()
    {
//      UIManager.put("Button.margin", new Insets(10, 10, 10, 10) );

        JFrame frame = new JFrame("Calculator Panel");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.add( new CalculatorPanel() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

单击按钮,值将显示在文本字段中。

关于java - 如何让按钮按下某个键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29155282/

相关文章:

java - JTable 单元格中的对齐方式

java - 为什么我的 Java while 循环迭代了一半

java - java中的网格布局行为

java - 使用 LIKE 子句将数据插入 mysql 数据库

java - 如何禁用 JWebBrowser 中的栏?

java - 如何使用默认模型表更新和检测选中的复选框

java - 我无法理解 Java 8 中的一些 lambda 表达式

java - 什么时候应该将 final 用于方法参数和局部变量?

java - 这些 setDefaultCloseOperation 语句之间的区别

java - 如何为每个子类创建一个 ArrayList?