Java“背景”打开很小,可以看到任何内容

时间:2016-02-08 02:56:11

标签: java swing

我正在制作游戏,游戏窗口只会打开标题的大小。请让我知道我需要做什么更改才能使“b.setSize(900,885)”工作。如果需要,我会更改或添加任意数量的代码。

 import java.awt.Color;
 import java.awt.Font;
 import java.awt.Graphics;
 import java.awt.Image;
 import java.awt.Rectangle;
 import java.awt.Window;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;

 import javax.swing.*;


 public class Background extends JFrame implements KeyListener,    ActionListener{
 int platform1X = 300, platform1Y = 555, platform2X, platform2Y;
 Image image;
 public boolean isJumping = false;
 int playerx = 100, playery = 585, velX = 0, velY = 0;
 public boolean[] keyDown = new boolean[4];
 private int fallingSpeed = 0;
 private int gravity = 5;
 private int jumpPower = -30;


 public Background(){

 addKeyListener(this);
 setFocusable(true);
 setFocusTraversalKeysEnabled(false);
 keyDown[0] = false;
 keyDown[1] = false;
 keyDown[2] = false;
 keyDown[3] = false;

 }
  public void paint(Graphics g){
 if(!isOnGround()){
 fall();
}
 ImageIcon i = new ImageIcon("/Users/kairotieremorton/Documents/java   code/Kairo and Enoch Game/src/images/Backgroundsquareman.png");
image = i.getImage();
g.drawImage(image, 0, 0, 900, 700, null);
g.setColor(Color.BLUE);
g.fillRect(platform1X, platform1Y, 120, 20);
g.setColor(Color.RED);
g.fillRect(playerx, playery, 30, 30);
try {
Thread.sleep(40);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} 


repaint();
playery = playery + velY;
playerx = playerx + velX; 
}



public static void main(String[] args){
Background b = new Background();
b.setTitle("Game");
b.setSize(900,885);
b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
b.setVisible(true);
}



public void keyPressed(KeyEvent e) {
int key = e.getKeyCode(); 
if(isOnGround() && key == KeyEvent.VK_SPACE){
 keyDown[0] = true; 

 jump();

 }
 //if(key == KeyEvent.VK_DOWN){ setvelY(5); keyDown[1] = true;}
 if(key == KeyEvent.VK_LEFT) { setvelX(-5); keyDown[2] = true;}
 if(key == KeyEvent.VK_RIGHT) { setvelX(5); keyDown[3] = true;}
 System.out.println(key);
 System.out.println(playerx);
 System.out.println(playery);
 }

 public void keyReleased(KeyEvent e) {
 int key = e.getKeyCode();

 if(key == KeyEvent.VK_SPACE){ keyDown[0] = false;}    //tempObject.setVelY(0);
//if(key == KeyEvent.VK_DOWN) keyDown[1] = false;//tempObject.setVelY(0);
 if(key == KeyEvent.VK_LEFT) keyDown[2] = false;//tempObject.setVelX(0);
 if(key == KeyEvent.VK_RIGHT) keyDown[3] = false; //tempObject.setVelX(0);

 //vertical movement
 if(!keyDown[0]) setvelY(0); System.out.println(isOnGround());

//horizontal movement
if(!keyDown[2] && !keyDown[3]) setvelX(0);
 }
public void keyTyped(KeyEvent e) {}

public void actionPerformed(ActionEvent e) {
 //playery = playery + velY;
 //playerx = playerx + velX; 
 //repaint();
 }
 public boolean isOnGround(){
 if(playery + (30 /2) >= 585) {
     return true;
 }
 return false;

 }

 public void fall(){
 playery = playery + fallingSpeed;
 fallingSpeed = fallingSpeed + gravity;

 }
 public void jump(){
 fallingSpeed = jumpPower;
 fall();
 }

 public void setvelX(int velX) {
 this.velX = velX;
 }
 public void setvelY(int velY) {
 this.velY = velY;
 }
 public float getvelX(){
 return velX;
 } 
 public float getvelY(){
 return velY;
 }
 public int getplayerx(){
 return playerx;
 }
 public int getplayery(){
 return playery;
 }
 public void setplayerx(int playerx) {
 this.playerx = playerx;
}
public void setplayery(int playery) {
this.playery = playery;
}
public Rectangle getBounds(){
return new Rectangle(getplatform1X(), platform1Y(), 120, 20);
}
public int getplatform1X(){
return platform1X;
}
public int platform1Y(){
return platform1Y;
}

public Rectangle getBoundsTop(){
return new Rectangle(getplayerx() + 10, getplayery(), 30 - 20, 5);
}
public Rectangle getBoundsBottom(){
return new Rectangle(getplayerx() + 10, getplayery() + 30 - 5, 30 - 20, 5);
}
public Rectangle getBoundsLeft(){
return new Rectangle(getplayerx(), getplayery()+10, 5, 30 -20);
}
public Rectangle getBoundsRigth(){
return new Rectangle(getplayerx() + 30 - 5, getplayery()+10, 5, 30 - 20);
}


}

2 个答案:

答案 0 :(得分:2)

好的,看了很多,但是......

public Rectangle getBounds() {
    return new Rectangle(getplatform1X(), platform1Y(), 120, 20);
}

是你的问题。 JFrame#getBoundsJFrame用于返回组件的位置和大小的方法,因为您已覆盖它,它现在将忽略您传递给setSize的任何值(直接或间接地)

请阅读以下内容,了解不应覆盖paint

等顶级容器JFrame的原因

作为一般的经验法则,您应该避免从JFrame延伸,因为您并没有真正向该类添加任何新功能,它会将您锁定在一个用例中,并根据您的经验,会引起其他问题。

您应该首先使用JPanel之类的内容,然后覆盖其paintComponent方法(并确保在进行任何自定义绘制之前调用super.paintComponent

查看Painting in AWT and SwingPerforming Custom Painting

你绘制的方法应该尽可能快地运行,所以你应该避免在paint方法中加载像加载图像这样的资源

Swing是单线程的,因此在Thread.sleep方法中调用paint将导致整个程序停止,包括它能够响应用户的新事件。

我也不鼓励你使用KeyListener,使用密钥绑定API会更可靠。请查看How to Use Key Bindings了解更多详情

答案 1 :(得分:1)

编辑:

获得相同结果的更好方法是调用b.setPreferredSize(dimension);然后打包()你的画面。

有关JFrame.pack()的更多信息,请参阅此答案: https://stackoverflow.com/a/22982334/5224040

在您的主要方法中尝试此操作:

public static void main(String[] args) {
    Background b = new Background();
    Dimension d = new Dimension(900, 885); //Create a new Dimension
    b.setTitle("Game");
    b.setPreferredSize(d);  //Set the PreferredSize;
    b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    b.pack();  //Pack the frame
    b.setVisible(true);  //Setting Visible
}

您还可以根据需要使用以下方法重新定位框架:

b.setLocationRelativeTo(null); //center the location on the screen.

b.setLocation(0, 0); //Set location explicitly

在b.pack()下面调用以下任一方法;重新定位你的框架。