Java 椭圆不响应控件

Java 椭圆不响应控件,java,swing,ellipse,Java,Swing,Ellipse,我有一个游戏,其中两个椭圆出现在JFrame上,一个由a-s-d-w键控制,另一个由箭头键控制。以下是我的跑步方法: public void run() { while (animator != null) { repaint(); player1.move(player1.direction); player2.move(player2.direction); try {

我有一个游戏,其中两个椭圆出现在JFrame上,一个由a-s-d-w键控制,另一个由箭头键控制。以下是我的跑步方法:

public void run() {
        while (animator != null) {
            repaint();

            player1.move(player1.direction);
            player2.move(player2.direction);
            try {  
                Thread.sleep(100);  
            } catch (InterruptedException e) {  
                break;  
            }  
        }
}
这是我的个人球员课程。这是player 1类的paintComponent方法。播放器1和播放器2是相同的,变量形状、xPos、YPO、大小和颜色都很好。它们依附于价值观

public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D)g;

    switch(Shape) {
    case 1: Ellipse2D.Double ball = new Ellipse2D.Double(xPos, yPos, size, size);         
    g2.setPaint(Color);
    g2.draw(ball);
    g2.fill(ball);
    break;

    case 2: Rectangle2D.Double rectangle = new Rectangle2D.Double(xPos, yPos, size, size);
    g2.setPaint(Color);
    g2.draw(rectangle);
    g2.fill(rectangle);
    break;
    }   
}       
我通过使用一个名为KeyController的类来控制椭圆的方向。下面是该程序的一个示例部分;其余的都一样记住这只是一个摘录:

public void keyPressed(KeyEvent e) {
    // Player 1 Left
    if(e.getKeyCode() == KeyEvent.VK_A){
        Player1.setDirection(270);
        System.out.println("A pressed");
    }

    // Player 1 Down
    if(e.getKeyCode() == KeyEvent.VK_S){
        Player1.setDirection(180);
        System.out.println("S pressed");
    }

    if(e.getKeyCode() == KeyEvent.VK_LEFT){
        Player2.setDirection(270);
        System.out.println("LEFT pressed");
    }

    if(e.getKeyCode() == KeyEvent.VK_DOWN){
        Player2.setDirection(180);
        System.out.println("DOWN pressed");
    }
程序的其余部分运行良好。它有一个按键和一个按键

现在我的问题是,当我运行我的程序时,我看到一个椭圆,所有的键都可以控制它,a-s-d-w键和箭头键

如果你需要更多的代码,就问我。我有一个主要的方法,效果很好


如何使椭圆响应控件?

下面是一个使用键移动圆的小示例:

public static void main ( String[] args )
{
    JFrame controls = new JFrame ();

    controls.add ( new JComponent ()
    {
        private Point location = new Point ( 250, 250 );
        private int speed = 5;

        {
            setFocusable ( true );
            requestFocusInWindow ();
            addKeyListener ( new KeyAdapter ()
            {
                public void keyPressed ( KeyEvent e )
                {
                    boolean changed = false;
                    if ( e.getKeyCode () == KeyEvent.VK_W || e.getKeyCode () == KeyEvent.VK_UP )
                    {
                        location.y -= speed;
                        changed = true;
                    }
                    else if ( e.getKeyCode () == KeyEvent.VK_A ||
                            e.getKeyCode () == KeyEvent.VK_LEFT )
                    {
                        location.x -= speed;
                        changed = true;
                    }
                    else if ( e.getKeyCode () == KeyEvent.VK_S ||
                            e.getKeyCode () == KeyEvent.VK_DOWN )
                    {
                        location.y += speed;
                        changed = true;
                    }
                    else if ( e.getKeyCode () == KeyEvent.VK_D ||
                            e.getKeyCode () == KeyEvent.VK_RIGHT )
                    {
                        location.x += speed;
                        changed = true;
                    }
                    if ( changed )
                    {
                        repaint ();
                    }
                }
            } );
        }

        protected void paintComponent ( Graphics g )
        {
            Graphics2D g2d = ( Graphics2D ) g;
            g2d.setRenderingHint ( RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON );

            g2d.setPaint ( Color.BLACK );
            g2d.drawOval ( location.x - 10, location.y - 10, 20, 20 );
        }
    } );

    controls.setSize ( 500, 500 );
    controls.setLocationRelativeTo ( null );
    controls.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
    controls.setVisible ( true );
}
使用简单键侦听器时,请确保组件具有焦点,否则它将根本不会接收任何键事件。因此,有时您必须强制更改重点组件:

component.requestFocusInWindow ();

1如果你需要更多的代码,就问我。这不是一个问题,与其说是一个观察,不如说是一个观察,但为了更快地获得更好的帮助,请发布一篇文章。2如果使用Swing,请查看键绑定。另请参见。使用键绑定不是最安全、最简单的方法吗,比如在天堂的某个地方捕捉异步聚焦???捕捉键事件并不总是最舒适的方法。例如,如果您正在编写某个游戏,其中唯一可见的组件是游戏场景或某个具有较大编辑区域的可视化编辑器,则使用键绑定是毫无意义的。最好的方法是将焦点集中在场景上一次,然后使用KeyListener处理传入事件。