Java 如何使jbutton在另一个组件中执行键盘笔划

Java 如何使jbutton在另一个组件中执行键盘笔划,java,swing,keyboard-shortcuts,jbutton,Java,Swing,Keyboard Shortcuts,Jbutton,在我的Java应用程序中,我有一个带有一些按钮的JFrame,还有一个带有键盘快捷键的COM组件。当用户单击这些按钮时,我需要这些按钮来执行这些快捷方式 例如: 应单击打印按钮以执行Ctrl+P 我如何实现这一点 谢谢 应单击打印按钮以执行Ctrl+p 按Ctrl+p会触发一个操作(至少,我认为您正在使用键绑定)。只需将操作与JButton耦合即可 您不应该尝试让按钮执行Ctrl+p。共享操作,这可以看作是JButton和键绑定背后的模型 应单击打印按钮以执行Ctrl+p 按Ctrl+p会触发一

在我的Java应用程序中,我有一个带有一些按钮的
JFrame
,还有一个带有键盘快捷键的COM组件。当用户单击这些按钮时,我需要这些按钮来执行这些快捷方式

例如: 应单击打印按钮以执行Ctrl+P

我如何实现这一点

谢谢

应单击打印按钮以执行Ctrl+p

按Ctrl+p会触发一个
操作
(至少,我认为您正在使用键绑定)。只需将
操作
JButton
耦合即可

您不应该尝试让按钮执行Ctrl+p。共享
操作
,这可以看作是
JButton
和键绑定背后的模型

应单击打印按钮以执行Ctrl+p

按Ctrl+p会触发一个
操作
(至少,我认为您正在使用键绑定)。只需将
操作
JButton
耦合即可


您不应该尝试让按钮执行Ctrl+p。共享
操作
,这可以看作是
JButton
和键绑定背后的模型。您可以使用
操作
和键绑定。看看这个例子:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class TestKeyBinding {

    private JFrame frame;

    public final class PrintAction extends AbstractAction {

        public PrintAction() {
            super("Print");
        }

        @Override
        public final void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(frame, "Perform some printing");
        }
    }

    protected void initUI() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        PrintAction printAction = new PrintAction();
        JButton button = new JButton("Print");
        button.registerKeyboardAction(printAction, KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK),
                JComponent.WHEN_IN_FOCUSED_WINDOW);
        button.setAction(printAction);
        JComponent comp = new JComponent() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(100, 100);
            }
        };
        frame.add(comp, BorderLayout.NORTH);
        frame.add(button);
        frame.setSize(300, 300);
        frame.setVisible(true);
        comp.requestFocusInWindow();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestKeyBinding().initUI();
            }
        });
    }
}

您可以使用
操作
和键绑定。看看这个例子:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class TestKeyBinding {

    private JFrame frame;

    public final class PrintAction extends AbstractAction {

        public PrintAction() {
            super("Print");
        }

        @Override
        public final void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(frame, "Perform some printing");
        }
    }

    protected void initUI() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        PrintAction printAction = new PrintAction();
        JButton button = new JButton("Print");
        button.registerKeyboardAction(printAction, KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK),
                JComponent.WHEN_IN_FOCUSED_WINDOW);
        button.setAction(printAction);
        JComponent comp = new JComponent() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(100, 100);
            }
        };
        frame.add(comp, BorderLayout.NORTH);
        frame.add(button);
        frame.setSize(300, 300);
        frame.setVisible(true);
        comp.requestFocusInWindow();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestKeyBinding().initUI();
            }
        });
    }
}

@ Limuxuni:还考虑<代码> GeMeNeSuthTutkEyMaskk()/Cube >,参见,以改进跨平台的体验。@ LIUXXUNIL:还考虑<代码> GeMeNeSuthTutkEyMaskk()<代码>,以改善交叉平台体验。