仅调整重新绘制JFrame的方法。重绘();好像不行

时间:2014-05-08 02:21:00

标签: java swing jpanel repaint

我目前正在尝试制作我的第一个游戏,但我无法使用repaint()方法。我检查了我的keyListeners,并确认他们正常工作!我创建的船只移动,但只有当我通过拖动侧面强行调整窗口大小。如果有人有任何提示,我会非常感激!

如果您需要更多信息,请随时提出!

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;




public class Main extends Canvas implements KeyListener{

public static Ship playerShip = new Ship(150,450,"F5S4-Recovered.png");

public int numberOfEnemies = 0;





public static void createFrame(){



   Window frame1 = new Window();

   final JPanel pane = new JPanel(){

     public void paintComponent(Graphics g){

        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, 1000, 1000);
        g.drawImage(playerShip.image, playerShip.xPos1, playerShip.yPos1, this);

    }     

  };

   frame1.add(pane);

}

public void keyTyped(KeyEvent e){System.out.println("KeyTyped");}

public void keyPressed(KeyEvent e){

    switch(e.getKeyCode())
    {
        case KeyEvent.VK_LEFT :
            playerShip.xPos1-=2;
            break;
        case KeyEvent.VK_RIGHT:
            playerShip.xPos1+=2;
            break;


    }


    repaint();

}

public void keyReleased(KeyEvent e){}

public static void main(String args[]){

     createFrame();

}   

}

Window class --------------------------------------------- -------------

    import javax.swing.*;



    public class Window extends JFrame{


        public Window()
        {
            setTitle("Space Game");
            setSize(800,800);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            addKeyListener(new Main());
            setVisible(true);

        }




    }

1 个答案:

答案 0 :(得分:1)

您对repaint()的来电正在重新绘制课程Canvas,但这幅画是在JPanel pane上完成的。调整大小会自动重新绘制面板。所以要修复你想要pane.repaint(),但除非你把面板作为类成员,否则你不能这样做,所以你可以从监听器方法访问它。现在,它目前在createFrame()方法的本地范围内。

另外,您应该将监听器添加到面板中,甚至不扩展Canvas,因为您甚至不使用它

其他注释:

  • 使用Key Bindings代替低级KeyListener

  • Swing应用程序应该从Event Dispatch Thread(EDT)运行。您只需将main中的代码包装在SwingUtilities.invokeLate(..)中即可。详情请见Initial Threads

  • 同样,我只想补充一点,不要延伸Canvas