我正试图将键绑定集成到我正在制作的程序中,但由于该程序很长,我正试图学习我在StackOverflow上发现的一个较小的类似编码程序。
下面是我使用的代码:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Demo {
@SuppressWarnings("serial")
private void initGUI() {
JPanel content = new JPanel(new FlowLayout());
content.add(new JLabel("Test:"));
AbstractAction buttonPressed = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
System.out.println(e.getSource());
if ("a".equals(e.getActionCommand()))
content.setBackground(new Color(227, 19, 19));
if ("b".equals(e.getActionCommand()))
content.setBackground(new Color(0, 225, 19));
}
};
JButton submit = new JButton("Submit");
submit.addActionListener(buttonPressed);
submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put(
javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_A,
java.awt.event.InputEvent.CTRL_DOWN_MASK),
"A_pressed");
submit.getActionMap().put("A_pressed", buttonPressed);
submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put(
javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_B, 0),
"B_pressed");
submit.getActionMap().put("B_pressed", buttonPressed);
content.add(submit);
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(content);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().initGUI();
}
});
}
}
我想要发生的是按CTRL+A,并有背景改变颜色。然而,当我这样做时,System.out.println(e.getActionCommand())
返回一个字符,看起来像一个问号在一个框里,就像它是一个未知的字符或什么的。如果您按下B,程序将工作,但添加修改符CTRL不能正常工作。
问题是我做得不对吗?程序是否正常工作,我不知道如何比较e.getActionCommand()
和什么字符串CTRL+A作为ActionEvent返回?请帮助。
据我所知,如果一个Action没有显式地设置它的actioncommand,它将在创建ActionEvent时设置。在你的代码中,actioncommand将是你的keyStroke (b和ctrl+a不是a)的charKey的字符串表示形式。所以我可以建议为每个动作设置一个不同的动作:
class simpleAction extends AbstractAction {
public simpleAction ( String name ) {
super ();
putValue ( Action.ACTION_COMMAND_KEY, name );
}
@Override
public void actionPerformed ( ActionEvent e ) {
System.out.println ( "getActionCommand----->" + e.getActionCommand () );
System.out.println ( "getSource----->" + e.getSource () );
if ( "a".equals ( e.getActionCommand () ) ) {
content.setBackground ( new Color ( 227, 19, 19 ) );
}
if ( "b".equals ( e.getActionCommand () ) ) {
content.setBackground ( new Color ( 0, 225, 19 ) );
}
}
}
JButton submit = new JButton ( "Submit" );
submit.addActionListener ( new simpleAction ( "Submit" ) );
submit.getInputMap ( javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW ).put (
javax.swing.KeyStroke.getKeyStroke ( java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_DOWN_MASK ), "A_pressed" );
submit.getActionMap ().put ( "A_pressed", new simpleAction ( "a" ) );
submit.getInputMap ( javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW ).put (
javax.swing.KeyStroke.getKeyStroke (
java.awt.event.KeyEvent.VK_B, 0 ),
"B_pressed" );
submit.getActionMap ().put ( "B_pressed", new simpleAction ( "b" ) );
或者第二个解决方案是检查ctrl+a
的字符串表示形式。所以你改变
if ( "a".equals ( e.getActionCommand () ) ) {
content.setBackground ( new Color ( 227, 19, 19 ) );
}
if ( "u0001".equals ( e.getActionCommand () ) ) {
content.setBackground ( new Color ( 227, 19, 19 ) );
}