0

これがコードです。正方形はレンダリングされますが、各ループをレンダリングする必要がありますが、移動しません。問題は、run()のCoreクラスにあるようです。

    package com.game;

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

public class Core implements Runnable{
    private static boolean running = true;
    public static JFrame frame = new JFrame();
    public static void main(String[] args) {
        frame.setResizable(false);
        frame.setBounds(100,100,600,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        start();
    }





package com.game;

import java.awt.Graphics;

import javax.swing.JPanel;

public class Paint extends JPanel{
    public static int x = 10;
    public void paintComponent(Graphics g){
        super.paintComponent(g);

        g.fillRect(x,10,100,100);
    }
}


        private static void start() {
            running = true;
            Thread thread = new Thread(new Core());
            thread.setPriority(Thread.MAX_PRIORITY);
            thread.start();
        }

        @Override
        public void run() {
            Paint p = new Paint();
            Container pane = frame.getContentPane();
            while(running){
                pane.add(p);
                pane.show();

                System.out.println(Paint.x);
            try {
                Thread.sleep(100);
            } catch (Exception e){}
        }
        }
    }

コードがなんらかの形で煩わしい場合は申し訳ありませんが、どのようにフォーマットすればよいかわかりません...

4

2 に答える 2

3

あなたはwhile (running)ループしています:

while(running){
   pane.add(p);
   pane.show();
   //....
}

Swing イベント スレッドを踏んでおり、このスレッドがそのアクションを実行できないようにしています。つまり、GUI を描画してユーザーとやり取りしています。Swing アプリケーションで繰り返し動作が必要な場合は、while (true) ループを使用せずに、代わりに Swing タイマーを使用します。

于 2012-05-20T17:15:38.007 に答える
1

あなたは変わっていないxのに、なぜそれを動かす必要があるのですか?

さらに、常に(1秒間に10回)ペイント(JPanelサブクラス)をフレームに追加して表示しています。

おそらく、メインメソッド(またはより良い場所)で一度追加して表示し、repaint()代わりにそのループで呼び出すことをお勧めします。

そして、それを使用しないでください。thread.setPriority(Thread.MAX_PRIORITY);それはめったに何も達成せず、おそらくあなたが望むものではありません。

于 2012-05-20T16:52:38.230 に答える