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

このクラスはメインクラス( JPanelextend)でペイントしないクラスです。いくつか試してみましたが、何も機能していないようです。

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();

getGraphics値を返すことができnullます。このメソッドによって返される結果の値は、アプリケーションが使用する現在のグラフィックス コンテキストのスナップ ショットにすぎません。これは、次のペイント サイクルで逆参照または変更される可能性があります。

Event Dispatching Thread (EDT) の外部から Swing コンポーネントをペイント/更新/変更/作成しないでください。グラフィックを更新しようとすると、EDT もそれを更新し、きれいにならないため、奇妙なペイント アーティファクトが発生する可能性があります。 .

あなたは見てみたいかもしれません

更新しました

「主要な」問題(コードをコンパイルできないことを除く)は、repaintリクエストが使用してペイントした変更を一掃することであると思われますmain.getGraphics

super.paintComponentまた、メソッド内で呼び出す必要がありますMain#paintComponent

例で更新

于 2013-01-29T04:48:48.287 に答える