簡體   English   中英

如何在Java中為JButton添加多個ActionMap

[英]How to add mulitple ActionMap for a JButton in Java

我在JPanel內放置了一個JButton。現在我通過AbstractAction向此按鈕添加了一個關鍵偵聽器。 但是我想要的是:說我已經為該按鈕分配了鍵盤鍵“ A”。 現在,當我按下鍵“ A”時,我想顯示在GUI上按下了該按鈕。 我嘗試使用Jbutton.setEnabled()。但這不起作用,因為我必須啟用和禁用按鈕。 而且我猜AbstractAction內部的動作要在結尾而不是在中間執行。 我在下面發布了我的代碼:

private Action buttonPressed(final JButton jButton,final Boolean black) {
    // TODO Auto-generated method stub      

    AbstractAction buttonPressed = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            int index=keys_names.indexOf(e.getActionCommand().toUpperCase());
            if(index>=0)
            {

                jButton.setEnabled(false);
                // DO some other action

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                jButton.setEnabled(true);



            }

        }
    };
    return buttonPressed;
}

和使用的JButton是:

JButton b1=new JButton();
b1.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A,0), keys_names.get(key_press));
b1.getActionMap().put(keys_names.get(key_press),buttonPressed(b1,false));

您可以簡單地調用JButton#doClick ,它應該在視覺上模仿被按下的按鈕,以及調用按鈕ActionListener 但是您要真正強調一個事實,可以使用JButton#doClick(int) ,它可以讓您傳遞按鈕應該“出現”的時間

例如...

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestButton {

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

    public TestButton() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JButton b1 = new JButton("Click Me");
                b1.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "bang");
                b1.getActionMap().put("bang", new ClickMeAction());

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(b1);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ClickMeAction extends AbstractAction {

        public ClickMeAction() {
            putValue(NAME, "Click me");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            JButton btn = (JButton) e.getSource();
            btn.doClick(1000);
        }

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM