java - 框架中应有红色矩形,但什么也看不到

标签 java swing jpanel java-2d thread-sleep

代码如下:

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!!");
}
}

ab

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

最佳答案

  1. 不要依赖神奇的数字...
  2. 不要依赖可能与实际不符的参数(public static int width = 600 不会与子组件的大小相同)。使用 getWidthgetHeight 获取组件的实际大小...
  3. 摆脱 defineObjects 并依赖组件的实际已知状态
  4. 摆脱 paint 方法并使用 paintComponent 代替
  5. 静态并不总是你的 friend
  6. 请勿使用 YouTube 作为引用,除非海报有引用;)
  7. 请阅读 Performing Custom Painting
  8. 请阅读 Painting in AWT and Swing
  9. 请阅读 Concurrency in 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) 几乎没有 sleep ,没有区别;) - 25fps 大约为 40 毫秒;)

关于java - 框架中应有红色矩形,但什么也看不到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16392094/

相关文章:

java - AWS Transcribe - 当我们看到 "IsPartial"标志设置为 False 时如何停止转录

java - 如何先按键再按值对 HashMap 进行排序?

java - 随机数组重复

java - 滚动或调整框架大小时,JPanel 中的绘图消失

java - 有没有办法知道 JPanel 是否已完成加载其内容?

java - Listener不是抽象的,不会重写JAVA抽象方法

java - 处理来自多个平面文件的海量数据,并根据需求转换为 xml 格式

java - 单击表从数据库中获取的错误

java - JTable 标题不显示

java - JPanel 上的组件未以原始大小显示