0
public class Main extends JPanel implements Runnable {

    private static final int WIDTH = 1000;
    private static final int HEIGHT = 800;
    TerranGenartor gen = new TerranGenartor();

    public Main() {
        setSize(WIDTH, HEIGHT);
        gen.run();
    }

    public void paintComponents(Graphics g) {
        repaint();

    }

    public void run() {
    }
}

我确实收到了一个错误

 TerranGenartor gen = new TerranGenartor(); 

我的TerranGenartor班级

public class TerranGenartor implements Runnable {

    Main main = new Main();
    Graphics g;
    Random r = new Random();
    int SMIN = 1;
    int SMAX = 3;
    int i = 0;
    int num;
    int x = 0;
    int y = 0;
    public Color grass = new Color(124, 252, 0);
    public Color stone = new Color(190, 190, 190);
    public Color dirt = new Color(139, 69, 19);
    boolean Runn = false;

    public void start() {
        Runn = true;
        System.out.println("Working...");
    }

    public TerranGenartor() {
        Runn = true;
    }

    protected void paintComponent(Graphics g) {
        g = main.getGraphics();
        while (Runn) {
            if (i <= 1000) {
                num = r.nextInt(SMAX - SMIN + 1) + SMIN;
                switch (num) {
                    case 1:
                        g.setColor(grass);
                        break;
                    case 2:
                        g.setColor(stone);
                        break;
                    case 3:
                        g.setColor(dirt);
                        break;
                    default:
                        g.setColor(grass);
                        break;
                }
                g.fillRect(x, y, 50, 50);
                x += 50;
                System.out.println(i);
                System.out.println("X: " + x);
                try {
                    Thread.sleep(15);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void run() {
        while (Runn) {
            paintComponent(g);
        }
    }
}

该类是不会在主类(JPanel扩展)中绘制的类。我尝试了一些东西,但似乎没有任何效果。

我的The_Runner班级

public class The_Runner {

    Main main = new Main();
    JFrame frame = new JFrame();
    private static final int WIDTH = 1000;
    private static final int HEIGHT = 800;
    String TITLE = "Map gen.";

    public The_Runner() {
        frame.setSize(WIDTH, HEIGHT);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setTitle(TITLE);
        frame.add(main);
    }

    public static void main(String[] args) {
        The_Runner runner = new The_Runner();
    }
}    

这个类只是遵守并运行它,我认为这一切都很好。

这样做的问题是,当我想从TerranGenerator课堂上绘画时,它不起作用。上没有显示任何内容JPanel

4

1 回答 1

2

让我们从...

setSize(WIDTH, HEIGHT);Main. 这是一个坏主意。这些值可以被布局管理器覆盖(假设您正在使用一个)。您应该覆盖getPreferredSize并返回它们...

public Dimension getPreferredSize() {
    return new Dimension(WIDTH, HEIGHT);
}

然后这个(也来自Main

public void paintComponents(Graphics g) {
    repaint();
}

你永远不应该repaint从一个paint方法中调用或调用任何可能导致repaint被调用的方法,你最终会陷入一个无限循环的厄运,这将使你的 CPU 循环到 100%

Main您在和之间有一个循环引用TerranGenartor。基本上你已经在每个中声明了每个的引用,编译器无法处理这个问题,因为它不能在不先构建另一个类的情况下构建一个类。

永远不要这样做...

g = main.getGraphics();

getGraphicsis 可以返回一个null值。此方法返回的结果值只不过是应用程序使用的当前图形上下文的快照。这可以在下一个绘制周期取消引用或更改。

永远不要从事件调度线程 (EDT) 外部绘制/更新/修改/创建任何 Swing 组件,如果这样做,您可能会得到奇怪的绘制工件,因为您尝试更新图形并且 EDT 也会更新它,永远不会漂亮.

你可能想看看

更新

我怀疑您的“主要”问题(除了无法编译代码之外)将是该repaint请求正在清除您通过使用绘制的任何更改main.getGraphics

您还应该在方法super.paintComponent内调用Main#paintComponent

更新了示例

于 2013-01-29T04:48:48.287 回答