java - GUI 对象不绘制

标签 java swing user-interface graphics

我一直在此处类似的线程中寻找答案,但我找不到我的代码有什么问题。
我正在尝试制作 agar.io 模拟器,但琼脂对象无法绘制。食物会吸引,但无论我做什么,琼脂都不会吸引。
琼脂类代码:

import java.awt.*;
import java.awt.event.*;

public class Agar {
    //instance field
    public static final int DEFAULT_SIZE = 1000, DEFAULT_X = 
    ArenaPanel.PANEL_WIDTH/2, DEFAULT_Y = ArenaPanel.PANEL_HEIGHT/2;

    private int x, y, size;

    private Color clr;

    public Agar(Color c) {
        x = DEFAULT_X;
        y = DEFAULT_Y;

        clr = c;
    }

    public void move() {
        //blank for now, not used yet
    }

    //grows by 10% width
    public void grow() {
        size += 10;
    }

    public void draw(Graphics fred) {
        fred.setColor(clr);
        fred.fillOval(0,0,size,size);

        fred.setColor(Color.black);
        fred.drawOval(0,0,size,size);
    }
}

面板类代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.ArrayList;

public class ArenaPanel extends JPanel {
    //instance field
    public static final int PANEL_WIDTH = 1000, PANEL_HEIGHT = 500;

    private ArrayList<Food> food;
    private Timer foodAdder;

    private Agar agar;

    public ArenaPanel() {
        //agar stuff
        agar = new Agar(getRandomColor());

        //food stuff
        food = new ArrayList<Food>();
        //add some initial food
        for (int i = 0; i < 50; i++)
            addRandomFood();

        //"this will last a while"
        foodAdder = new Timer(3000, new FoodAdder());
        foodAdder.start();

        //listeners
        addComponentListener(new ResizeListener());

        //more basic stuff
        setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
        setBackground(Color.white);
    }

    public void paintComponent(Graphics fred) {
        super.paintComponent(fred);

        agar.draw(fred);

        for (int i = 0; i < food.size(); i++)
            food.get(i).draw(fred);
    }

    //put it here so I can use it for both agar and food
    private Color getRandomColor() {
        int rand = (int)(Math.random()*7);
        Color c;

        switch (rand) {
            case 0:
            c = Color.red;
            break;
            case 1:
            c = Color.orange;
            break;
            case 2:
            c = Color.yellow;
            break;
            case 3:
            c = Color.green;
            break;
            case 4:
            c = Color.cyan;
            break;
            case 5:
            c = Color.blue;
            break;
            default:
            c = Color.pink;
        }

        return c;
    }

    private void addRandomFood() {
        int x = (int)(Math.random()*PANEL_WIDTH);
        int y = (int)(Math.random()*PANEL_HEIGHT);

        food.add(new Food(x,y,getRandomColor()));
    }

    private class FoodAdder implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            addRandomFood();

            repaint();
        }
    }

    private class ResizeListener extends ComponentAdapter {
        public void componentResized(ComponentEvent e) {
            setPreferredSize(getSize());
        }
    }
}

我尝试调试(将System.out.println命令放入draw()、paintComponent()、agar的构造函数中),所有方法实际上都运行正常。所以我想也许它只是没有显示出来,但即使当我尝试将琼脂的颜色更改为位于 0,0 处的黑色方 block (这应该与彩色圆形食物形成鲜明对比)时,它仍然没有显示。
这里可能出现什么问题?

最佳答案

它的大小为零。至少调用方法 grow 一次。

关于java - GUI 对象不绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50779166/

相关文章:

java - 如何根据用户输入执行不同的操作

java - 按键监听器不响应数字键盘数字

Java - 监听系统安全粘贴命令

java - 需要一点帮助,隐藏/禁用 jbutton

javax.xml.绑定(bind).JAXBException : class <ClassName> nor any of its super class is known to this context

java - 如何覆盖 executorService 关闭方法

java - 如何判断线程是否已完成?

java - Hive2 JDBC错误

java - 在 actionPerformed 方法中重构 JFrame

android - 如何使用 RelativeLayout 实现以下结果?