0

私の JPanel は再描画しません。スレッドを使用してループから再描画メソッドを呼び出しています。ループが機能することは 100% 確信していますが、repaint(); を呼び出すときは 何も起こりません

package jgame.org.game;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class GamePanel extends JPanel implements Runnable
{   
    @Override
    public void paint(Graphics g)
    {
        if (gameState == 0)
        {
            g.drawImage(new ImageIcon(System.getProperty("user.home")
                    + "/jGame/FruitSlayer/Sprites/splash.png").getImage(), 0,
                    0, null);
        } else
        {
            g.drawImage(new ImageIcon(System.getProperty("user.home")
                    + "/jGame/FruitSlayer/Sprites/white.png").getImage(), 0,
                    0, null);
        }
        System.out.println("REPAINT");
    }

    public int currentLoopTime, gameState;

    @Override
    public void run()
    {
        while (true)
        {
            if (gameState != 1)
            {
                currentLoopTime += 1;
                if (currentLoopTime == 2000)
                {
                    gameState = 1;
                }
            }
            repaint();
        }
    }
}

そして私のゲームクラス:

package jgame.org.game;

import java.awt.Dimension;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Game extends JFrame
{
    public Dimension size = new Dimension(605, 625);

    public Game()
    {
        super("Fruit Slayer");
        setSize(size);
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setVisible(true);
        (new Thread(new GamePanel())).start();
        add(new GamePanel());
    }

    public static void main(String[] args)
    {
        new Game();
    }

}

REPAINT はコンソールに出力されませんが、ループに追加すると完全に機能します。paint(Graphics); を呼び出さない原因は何ですか? repaint() を使用しているのに;???

4

2 に答える 2

2

古代の遺跡がいくつかあり、良いアイデアはありません

  • override public void paintComponent (Graphics g) の代わりにpublic void paint(Graphics g)Swing JPanel

  • 次の行はsuper.paint()/にする必要がありますsuper.paintComponent()

  • /Object内に s をロードしないでください(リソースからのものかどうかは関係ありません) prepareなどをローカル変数にロードしないでくださいpaintpaintComponentFileIOImage

  • のオーバーライドgetPreferredSizeJPanelそれ以外の場合、ペイントはゼロ次元を返します

  • の代わりにSwing Timer今日の使用Java6/7Runnable#Thread

于 2013-10-18T21:31:36.320 に答える