Java Swing. Czemu czasem nic nie jest rysowane?

0

Jakieś 3 uruchomienia na 10 nic nie rysuja i nie wiem czemu tak się dzieje.

Ekstra pytanie:
Nie bardzo rozumiem jak działa getContentPane()
jak róznią się te dwie linijki kodu? Której użyć?
frame.getContentPane().add(new Board());
frame.add(new Board());

class Game {
	JFrame frame;
	static final int width = 500;
	static final int height = 500;
	
	Game() {
		frame = new JFrame();
		frame.setSize(width,height);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.setResizable(false);
		frame.getContentPane().add(new Board());
		//frame.add(new Board());
	}

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

class Board extends JPanel {
	public void paint(Graphics g) {
		g.fillRect(20, 20, 100, 100);
	}
}



0

u mnie działa zawsze: rysuje maly czarny kwadrat. Uzywam intelij, Game i Board sa w oddzielnych plikach, uruchamiam program przez Game. Napisz wiecej o swoim srodowisku lub wrzuc screena. Czy pojawiaja sie jakies błędy?

0

Pisze na linuxie w eclipsie java8
Ten sam kod i trzy różne efekty: szary lub czarny kwadrat lub brak kwadratu

0

frame.setVisible(true);
To wywołuj na końcu (jak już wszystkie elementy są pododawane).

2

Generalnie nie powinieneś nadpisywać metody paint, tylko paintComponent

Amy Fowler napisał(a) w Painting in AWT and Swing:

Swing programs should override paintComponent() instead of overriding paint()

A nawet wtedy powienieś wywołać super.paintComponent. Obie metody, paint i paintComponent robią dużo rzeczy. Jak je nadpiszesz, i nie wywołasz supera mogą się dziać dziwne rzeczy.
Ponadto, żeby przerysować komponenty musisz wywołać metodę repaint (albo tak jak wyżej napisano, wywołać setVisible na samym końcu, bo setVisible w środku wywołuje repaint)
Poczytaj sobie:
https://docs.oracle.com/javase/tutorial/uiswing/painting/index.html
https://www.oracle.com/technetwork/java/painting-140037.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1