ActionEvent不能识别CTRL键绑定



我正试图将键绑定集成到我正在制作的程序中,但由于该程序很长,我正试图学习我在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 ) );
            }

最新更新