[英]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.