Swingのrepaintについて

2026 ワード

1つのJFrameを直接repaintすると、画面が点滅したり、画面が表示されないという問題が発生します
次のコード

import javax.swing.*;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class S2P11 extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	final int WIDTH = 900, HEIGHT = 650;
	double p1Speed = .5, p2Speed = .5;
	
	/************************************************/
	final int UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3;
	int p1Direction = UP;
	int p2Direction = UP;
	/************************************************/
	
	
	Rectangle p2 = new Rectangle(WIDTH/9 + (int)(WIDTH/9*1.5/2), (HEIGHT/2) + (HEIGHT/10), WIDTH/30, WIDTH/30);
	Rectangle p1 = new Rectangle(WIDTH/9, HEIGHT/2, WIDTH/30, WIDTH/30);
	
	public S2P11() {
		super("Radical Racing");
		setSize(WIDTH/9*10, HEIGHT/9*10);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setVisible(true);
		new Thread()
		{
			public void run() {while(true)
			{
				while(true)
					{
					repaint();
					 p2.y+=10;
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					}
			}};
		}.start();
	}
		
		public void paint(Graphics g){
			super.paint(g);
			Graphics2D g2d=(Graphics2D)g;
			g2d.setColor(Color.DARK_GRAY);
			g2d.fillRect(0, 0, WIDTH, HEIGHT);
			g2d.setColor(Color.red);
			g2d.fill3DRect(p2.x, p2.y, p2.width, p2.height,true);
	}
		

			
			
		/************************************************/
	
	public static void main(String[] args) {
		new S2P11();
		
	}

}

表示内容を更新する場合は、Frameを直接更新するのではなく、JFrameにJPanelを追加してJPanelを更新します.