Java-代码已编译,但无法识别操作
由于关注的问题,我在Java中遇到了一些关键侦听器方面的问题,因此我阅读了相关内容,许多网站建议改用关键绑定。 下面是我的代码,我正在尝试将空格键映射到动作测试动作。panel对象只是JPanel的一个扩展Java-代码已编译,但无法识别操作,java,binding,key,action,Java,Binding,Key,Action,由于关注的问题,我在Java中遇到了一些关键侦听器方面的问题,因此我阅读了相关内容,许多网站建议改用关键绑定。 下面是我的代码,我正在尝试将空格键映射到动作测试动作。panel对象只是JPanel的一个扩展 public class Template_Main { static Boolean quit = false; public static void main(String[] args) { Window window = new Window(); wh
public class Template_Main {
static Boolean quit = false;
public static void main(String[] args) {
Window window = new Window();
while(!quit) {
window.update();
}
System.exit(0);
}
}
问题是,尽管它编译时没有出错,但当我按下空格键时,什么也没有发生。我认为你的问题正如威廉·莫里森(William Morrison)所说的那样,JPanel没有集中精力
当面板被添加时,尝试调用。如果您可以发布一个小的包含代码示例,我们可以为您提供更多帮助。使用您的代码作为基础,这是可行的
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class App extends JFrame
{
public static void main( String args[] )
{
new App();
}
public App()
{
super( "Test App" );
setLocationRelativeTo( null );
setSize( 600, 450 );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
getContentPane().add( new KeyBindingPane() );
setVisible( true );
}
private class KeyBindingPane extends JPanel
{
public KeyBindingPane()
{
this.getInputMap().put( KeyStroke.getKeyStroke( "SPACE" ), "pressed" );
this.getInputMap().put( KeyStroke.getKeyStroke( "released SPACE" ), "released" );
getActionMap().put( "pressed", new SpaceBarAction() );
getActionMap().put( "released", new SpaceBarAction() );
requestFocus();
}
}
public class SpaceBarAction extends AbstractAction
{
@Override
public void actionPerformed( ActionEvent e )
{
System.out.println( "ACTION PERFORMED (SPACE BAR)" );
}
}
}
谢谢大家的帮助 你说得对,面板没有对焦,包含它的框架没有对焦。
添加
panel.requestFocus()代码>修复它 按空格键时面板是否有焦点?代码是否太大而无法完整发布?或者是一个简短的可编译示例?我没有看到任何明显的错误。您是否必须使用JComponent.getActionMap()
和JComponent.getInputMap()
?因为如果您不这样做,您可以简单地添加keylister
s/KeyAdapter
s。您可以发布显示添加绑定调用的代码吗?只需使用System.out.println再次检查代码是否实际注册了绑定
import javax.swing.JFrame;
public class Frame extends JFrame {
public Frame() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle(Config.TITLE);
setResizable(Config.RESIZABLE);
setVisible(true);
}
}
import java.awt.Dimension;
import javax.swing.JPanel;
public class Panel extends JPanel {
public Panel() {
setPreferredSize(new Dimension(Config.WIDTH,Config.HEIGHT));
setLayout(null);
setBackground(Config.BG_COLOR);
setFocusable(true);
}
}
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
public class TestAction extends AbstractAction {
public TestAction() {
}
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("ACTION PERFORMED");
}
}
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class App extends JFrame
{
public static void main( String args[] )
{
new App();
}
public App()
{
super( "Test App" );
setLocationRelativeTo( null );
setSize( 600, 450 );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
getContentPane().add( new KeyBindingPane() );
setVisible( true );
}
private class KeyBindingPane extends JPanel
{
public KeyBindingPane()
{
this.getInputMap().put( KeyStroke.getKeyStroke( "SPACE" ), "pressed" );
this.getInputMap().put( KeyStroke.getKeyStroke( "released SPACE" ), "released" );
getActionMap().put( "pressed", new SpaceBarAction() );
getActionMap().put( "released", new SpaceBarAction() );
requestFocus();
}
}
public class SpaceBarAction extends AbstractAction
{
@Override
public void actionPerformed( ActionEvent e )
{
System.out.println( "ACTION PERFORMED (SPACE BAR)" );
}
}
}