0

这是代码:

aa 级

package com.MahBonnets.Game;

import javax.swing.*;

public class aa {

public static ab f = new ab();
public static int width = 600;
public static int height = 400;
public static void main(String args[]) {
        f.setSize(width, height);
        f.setResizable(false);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("MAH BONNETS IS GONE");
        f.setLocationRelativeTo(null);
        System.out.println("Running!!");
}
}

抗体

package com.MahBonnets.Game;

import java.awt.GridLayout;
import javax.swing.*;

public class ab extends JFrame {

public ac panel;

public ab() {
    panel = new ac(this);
    setLayout(new GridLayout (1, 1, 0, 0));
    add(panel);
}
}

和交流

package com.MahBonnets.Game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.*;

public class ac extends JPanel implements Runnable {
public Rectangle floor;

public int floorheight = 80;
public int fps = 1000;

public boolean objectDefine = false;

public Thread game;
public ac(ab f) {
    setBackground(Color.black);

    defineObjects();

    game = new Thread(this);
    game.start(); }

void defineObjects() {
        floor = new Rectangle(-10, aa.height-floorheight, aa.width+10, floorheight);
        objectDefine = true;
        repaint();
}

public void paint(Graphics g) {
    super.paint(g);

    if(objectDefine) {
        g.setColor(Color.RED);
        g.fillRect(floor.x, floor.y, floor.width, floor.height);
}
}


public void fpsSetter() {
try{
    Thread.sleep(fps/1000); 
}catch(Exception e) {
    e.printStackTrace();

        }

  }
  @Override
  public void run(){
      // TODO Auto-generated method stub
  }
}

没有发生而应该发生的是应该在 JFrame 的底部出现一个红色矩形。我对编程完全陌生,但是我查看了与矩形有关的代码部分,一切看起来都井井有条……至少……据我所知。

如果您有任何想法,请帮帮我。谢谢。

这是我一直关注的 youtube 教程http://www.youtube.com/watch?v=0lfhcKAIr-8

4

3 回答 3

3
  1. 不要依赖幻数...
  2. 不要依赖可能与现实不符的参数(public static int width = 600不会与您的子组件大小相同)。使用getWidthandgetHeight获取组件的实际大小...
  3. 摆脱您defineObjects并依赖于组件的实际已知状态
  4. 摆脱您的paint方法并paintComponent改用
  5. static并不总是你的朋友
  6. 不要使用 YouTube 作为参考,除非海报有参考;)
  7. 请阅读执行自定义绘画
  8. 请阅读AWT 和 Swing 中的绘画
  9. 请阅读Swing 中的并发

paint用更像这样的东西替换你的方法......

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.

    int x = -10;
    int y = getHeight() - floorheight;
    int width = getWidth() + 10;
    int height = floorheight;
    floor = new Rectangle(x, y, width, height);
    g.setColor(Color.RED);
    g.fillRect(floor.x, floor.y, floor.width, floor.height);
}

并且Thread.sleep(1000 / 1000)几乎没有睡眠,没有区别;)- 25fps 大约是 40 毫秒;)

于 2013-05-06T05:48:33.133 回答
2

不要覆盖paint(Graphics g). 尝试覆盖paintComponent(Graphics g)

于 2013-05-06T05:16:20.077 回答
2

在您的“aa”类中,尝试使用 main 方法的本地变量,而不是 ab 的静态实例(行:public static ab f = new ab();)。喜欢:

//public static ab f = new ab();
public static int width = 600;
public static int height = 400;
public static void main(String args[]) {
        ab f = new ab(); // local var
        f.setSize(width, height);
        f.setResizable(false);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("MAH BONNETS IS GONE");
        f.setLocationRelativeTo(null);
        System.out.println("Running!!");
}

或者,您可以从“ac”类的 defineObjects() 方法中删除对 aa.width 和 aa.height 的静态引用。

floor = new Rectangle(-10, aa.height-floorheight, aa.width+10, floorheight); //take out the static references !!!

做一个简单的测试来了解原因。在进行任何更改之前,打印 aa.width 和 aa.height 的值,您会看到它们为零。

于 2013-05-06T05:32:27.827 回答