Java-JPanel getGraphics()
Da Java unterstützt nur single inheritance
, ich möchte paint
direkt auf eine Instanz einer JPanel
ist ein Mitglied der Klasse Panel
. Ich schnappe mir eine Instanz von Graphics
von dem Mitglied und dann malen, was auch immer ich Lust drauf.
Wie kann ich nicht Erben aus JComponent
oder JPanel
- und immer noch nutzen getGraphics()
für die Malerei auf this
ohne überschreiben public void paintComponent(Graphics g)
?
private class Panel
{
private JPanel panel;
private Grahics g;
public Panel()
{
panel = new JPanel();
}
public void draw()
{
g = panel.getGraphics();
g.setColor(Color.CYAN);
g.draw(Some Component);
panel.repaint();
}
}
Dem panel Hinzugefügt wird JFrame
dass sichtbar gemacht wird, bevor ein Aufruf panel.draw()
. Dieser Ansatz ist nicht für mich arbeiten, und das, obwohl ich bereits weiß, wie zu malen, benutzerdefinierte Komponenten durch Erben von JPanel
und überschreiben public void paintComponent(Graphics g)
ich wollte nicht Erben aus JPanel
.
getGraphics
. Der Grafik-Kontext zurück aus es ist nicht das gleiche, das paintComponent übergeben. In deinem Fall wahrscheinlich nicht funktioniert, da ruft repaint löscht, was auch immer Sie gemalt. Können Sie erklären, was Sie versuchen zu erreichen? Wie es ist, wie es scheint, ein XY-problem.Zum Beispiel hier ist eine ähnliche Frage, aber du hast gesagt, dass speziell Sie nicht wollen, um JPanel erweitern und paintComponent überschreiben. Es wäre hilfreich, zu erklären, was Sie tun und warum, so dass Lösungen vorgeschlagen werden können.
Dies ist nicht ein XY-problem, weil ich weiß bereits die Lösung zu meinem problem. Ich möchte nur wissen, wie sich die Verwendung der oben beschriebenen Methodik.
Sie sollten nicht getGraphics. Um ehrlich zu sein, ich bin auch nicht wirklich sicher, warum es existiert in der API. Sobald das panel wird gestrichen (wie das passieren kann, automatisch und zu 100% außerhalb Ihrer Kontrolle liegen) das Bild mit getGraphics wird verschwinden. In der Regel wird die Lösung zu sagen, "nicht getGraphics verwenden, überschreiben paintComponent", aber Sie haben gesagt, Sie wollen das nicht.
Sie können ganz einfach, erstellen Sie zum Beispiel ein BufferedImage zu zeichnen, um außerhalb von paintComponent und dann das Bild zu zeichnen auf dem JPanel. Aber Sie sind nur noch nicht gesagt, was du eigentlich machen willst.
InformationsquelleAutor Mushy | 2014-01-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier sind einige sehr einfache Beispiele, die zeigen, wie man die Farbe aussen
paintComponent
.Der Zeichnung passiert eigentlich auf einem
java.awt.image.BufferedImage
, und wir können es überall, solange wir auf dem Event Dispatch Thread. (Für die Diskussion von Multi-Threading mit Schaukel, sehen, hier und hier.)Dann bin ich überschreiben
paintComponent
, aber nur zu malen, das Bild auf dem panel. (Ich Male auch ein wenig swatch in der Ecke.)Diese Weise die Zeichnung ist eigentlich permanent, und Swing ist in der Lage, Sie zu streichen, das panel, wenn es muss, ohne dass ein problem für uns. Wir könnten auch etwas tun, wie speichern Sie das Bild in einer Datei leicht, wenn wir es wollten.
Es ist auch möglich, eine
JLabel
mit einemImageIcon
, obwohl ich persönlich weiß nicht, wie diese Methode. Ich glaube nicht, dassJLabel
undImageIcon
erforderlich sind, Ihre Daten zu sehen, die änderungen, die wir machen, um das Bild nach haben wir es übergeben den Konstruktoren.Diese Weise auch nicht lassen, uns Sachen tun, wie die Malerei der swatch. (Für eine etwas kompliziertere paint-Programm, auf der Ebene von z.B. MSPaint, wir wollen einen Weg, um einen Bereich auszuwählen, und ziehen Sie einen Begrenzungsrahmen um ihn herum. Das ist ein weiterer Ort, den wir wollen in der Lage sein, um die Farbe direkt auf die Platte, die neben der Zeichnung zum Bild.)
InformationsquelleAutor Radiodef
dann können Sie Folgendes tun
Holen Sie sich die SomeComponent Instanz in der Systemsteuerung, und ändern Sie es
V ist eine Klasse, die Sie erweitert JFrame und enthält das panel in es UND
ich ist Instanz von SomeComponent
JComponent
oderJPanel
während immer noch die Malerei auf einer lokalen Instanz vonJPanel
mit Wohnsitz in meiner KlassePanel
.gut, ich hatte dein problem vor , und dieses war die einzige Möglichkeit, die ich gefunden, um die Bearbeitung zu ermöglichen paintComponent () - Methode ,und hier nicht Ihre Erben von JPanel , Ihr tun, Ihre eigene Farbe-Klasse
Sieht nicht wie es ist ein Weg, dies zu tun, ohne die Verwendung von Vererbung und überschreiben von paintComponent().
Dies ist nicht, wie Malerarbeiten im Gange. Werfen Sie einen Blick auf Performing Custom Painting und Malen in AWT und Swing für mehr Informationen darüber, wie die Malerei funktioniert
Sie sollten nie erhalten ein Verweis auf eine
Graphics
Kontext, die Sie nicht selbst erstellen. Swing verwendet eine passive Malerei Ansatz, was bedeutet, die Farben können jederzeit auftreten, als durch die repaint-manager, und alles, was bisher gemalt, wird verloren sein,...InformationsquelleAutor fady taher