JFrame和JPanel大小在java中没有变化

时间:2014-06-08 09:46:32

标签: java swing jframe jpanel

我正在制作汽车游戏,我刚刚遇到屏幕大小的问题,它不允许汽车移动(它应该能够在所有屏幕上移动),也许jpanel的大小不是大小合适。

Main和JPanel:

public class MyCarGame extends JPanel implements Runnable {

CarPlayer Player;

public MyCarGame(GUI frame) {
    Player = new CarPlayer(0, 0);

    this.setSize(WidthFrame,HeightFrame);
    this.addKeyListener(new KeyListener());

}

public void draw(Graphics g) {
    Player.draw(g);
    repaint();
}

/**
 * @param args the command line arguments
 */
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
    draw(g);

}

@Override
public void run() {
    while (true) {
        Player.move();
        try {
            Thread.sleep(10);
        } catch (InterruptedException ex) {
            Logger.getLogger(MyCarGame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

private class KeyListener extends KeyAdapter{

@Override
public void keyPressed(KeyEvent e) {
    switch (e.getKeyCode()) {
        case KeyEvent.VK_RIGHT:
            Player.xVel = 3;
            break;
        case KeyEvent.VK_LEFT:
            Player.xVel = -3;
            break;
        case KeyEvent.VK_UP:
            Player.yVel = -3;
            break;
        case KeyEvent.VK_DOWN:
            Player.yVel = 3;
            break;
    }
}

@Override
public void keyReleased(KeyEvent e) {
    switch (e.getKeyCode()) {
        case KeyEvent.VK_RIGHT:

        case KeyEvent.VK_LEFT:
            Player.xVel = 0;
            break;
        case KeyEvent.VK_UP:
        case KeyEvent.VK_DOWN:
            Player.yVel = -1;
            break;

    }
}
}

public static int WidthFrame = 0;
public static int HeightFrame = 0;

public static void main(String[] args) {
    // TODO code application logic here
    new GUI().setVisible(true);
}

}

玩家类:

public class CarPlayer {
int x;
int y;
Image img;
public  int xVel;
public int yVel;
public CarPlayer(int x,int y){

img= new ImageIcon("images/PlayerCar.png").getImage();  
this.x=x;
this.y=y;
xVel=0;
yVel=-1;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}


public void move(){
    if(x+xVel<(MyCarGame.WidthFrame-50) && x+xVel>0)
x+=xVel;
    if(y+yVel<(MyCarGame.HeightFrame-100) && y+yVel>0)
y+=yVel;
if(x<0){
xVel=0;
}
if(y<0){
    yVel=0;

}
if(y>(MyCarGame.HeightFrame-100)){ 
yVel=0;
}
if(x>(MyCarGame.WidthFrame-50)){  
    xVel=0;
}
}



public void draw(Graphics g){

g.drawImage(img, x, y,50,100, null);

}

}

框架类:

 public class GUI extends javax.swing.JFrame {

/**
 * Creates new form GUI
 */
 MyCarGame g;
public GUI() {
    this.setFocusable(false);
    this.setResizable(false);
    this.setExtendedState(JFrame.MAXIMIZED_BOTH);
    MyCarGame.WidthFrame=this.getWidth(); 
    MyCarGame.HeightFrame=this.getHeight(); 
    g=new MyCarGame(this);
    this.add(g);
    g.setLocation(0, 0);
    g.requestFocusInWindow();
    Thread t= new Thread(g);
    t.start();
    }
}

2 个答案:

答案 0 :(得分:1)

你依赖&#34;魔法&#34;价值,或试图......

public GUI() {
    this.setFocusable(false);
    this.setResizable(false);
    this.setExtendedState(JFrame.MAXIMIZED_BOTH);
    MyCarGame.WidthFrame = this.getWidth();
    MyCarGame.HeightFrame = this.getHeight();

此时,相框尺寸仍为0x0,因为在您尝试将其显示之前,相框并不真正知道它将在哪个屏幕上显示。

这些值也没有考虑框架边框可能具有的插图,并且它们在平台和外观之间发生变化(甚至可以在同一平台的不同实例之间进行更改)

简单的解决方案,摆脱它。 static对此不是一个好的选择,更好的解决方案是更改move方法,要求调用者传递可用空间的宽度和高度......

例如......

public void move(int width, int height) {

然后,当你需要调用它时,你可以使用类似......

的东西
Player.move(getWidth(), getHeight());

避免使用KeyListener,这只是麻烦,请考虑使用key bindings API。它可以更好地控制触发关键事件所需的焦点水平......

不要直接或间接地从任何绘制方法中调用repaint,这只会继续引发绘制事件,最终会消耗你的CPU

在我的系统上,setResizable没有与setExtendedState很好地玩耍...你可能想要考虑摆脱setResizable选项......

答案 1 :(得分:0)

首先,对于变量名称,一些建议使用小写字母。

其次,如果您已经在绘画,请不要在MyCarGame类上重绘draw()方法。你搬完车后应该问它。而你的游戏循环需要更多控制。 关于游戏循环,请使用以下链接:https://www.google.pt/#q=java+game+loop