2011-01-09 5 views
2

Ich habe einen Jrame, auf dem ich einige JComponent Objekte hinzufüge. Jede JComponent hat eine Liste von Containern, die ich mit JComponent.add (Component) hinzufüge.Farbe auf einen Container, der zu jcomponent hinzugefügt wird

Jetzt in meiner Hauptklasse JComponent, MyComponent genannt, überschreibe ich die geschützte Methode paintComponent, wo ich Dinge malen kann, was ziemlich gut funktioniert.

Aber ich möchte nicht auf die Haupt-JComponent malen, ich möchte nur auf die Container malen, die ich zu meiner Haupt-JComponent hinzugefügt habe.

Also in MyComponent in paintComponent mache ich folgendes.

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    Graphics page_g = this.getPage("main").getGraphics(); 

    page_g.setColor(Color.RED); 
    page_g.drawRect(10, 10, this.getWidth() - 20, this.getHeight() - 20); 
    page_g.setColor(Color.BLUE); 
    page_g.drawString("HELLO WORLD", this.getWidth()/2, this.getHeight()/2); 
} 

Die Zeile this.getPage ("main"). GetGraphics(); nimmt das Graphics-Objekt aus einem meiner Container, die der Containerliste von MyComponents hinzugefügt wurden, und natürlich die Hauptkomponentenliste mit der JComponents-add-Methode. Der Container wird durch Aufruf von setVisible (true) auf visible gesetzt; Methode.

Aber nichts passiert. Der Bildschirm ist leer. Wenn ich page_g durch g ersetze, dann funktioniert das Painting, weil es auf meine JComponent (MyComponent) gemalt wird, aber ich möchte in diesem Fall auf den Container malen, der ein Kind von MyComponent ist.

Ich hörte oft "Niemals getGraphics() verwenden". Aber wie sonst kann NUR auf Unterkomponenten einer Elternkomponente zurückgreifen, wenn die Eltern-PaintComponent-Methode aufgerufen wird?

Antwort

1

Wirklich die beste Wette ist, dass die Klassen, die tatsächlich die benutzerdefinierte Malerei tun, ihre eigene paintComponent() -Methode überschreiben. Lassen Sie den AWT sich Gedanken über die Grafikkontexte machen.

+0

Aber das bedeutet, ich muss eine Klasse für jeden Container definieren, den ich meiner Komponente hinzufügen möchte. Aber ich möchte das alles in meiner Komponentenklasse machen. Ich weiß, es ist der beste Weg, sich von getGraphics fern zu halten. Aber ich habe nur gefragt, ob es noch eine gute Lösung gibt. – NovumCoder

+0

@novum Es kann ein wenig mehr Arbeit sein, aber es ist viel besser, die benutzerdefinierte Malerei an das Objekt zu delegieren, das die beste Information hat, um eine solche Aufgabe, das Objekt selbst, auszuführen. Auch der AWT kann verfolgen, welche Komponenten sichtbar sind, usw .. und nur diejenigen neu streichen, die es brauchen. –

+0

Ok du bist richtig. Die Regel "Verschwende nie mit AWTs-Grafikkontext" sollte nicht ignoriert werden. Danke RD01. – NovumCoder

Verwandte Themen