Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-代码已编译,但无法识别操作_Java_Binding_Key_Action - Fatal编程技术网

Java-代码已编译,但无法识别操作

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

由于关注的问题,我在Java中遇到了一些关键侦听器方面的问题,因此我阅读了相关内容,许多网站建议改用关键绑定。 下面是我的代码,我正在尝试将空格键映射到动作测试动作。panel对象只是JPanel的一个扩展

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)" );
        }
    }
}