getGraphics() eines JPanel liefert immer null zurück

Status
Nicht offen für weitere Antworten.

hupfdule

Top Contributor
Ich benötige innerhalb eines TableCellRenderers die Möglichkeit Linien auf die Zellen zu zeichnen. Die Zellen werden bereits von mir durch gesonderte JPanels dargestellt. In bestimmten Fällen soll zum Schluss eine Linie darüber gezeichnet werden. Leider passiert das nicht, weil getGraphics ausschließlich null zurück liefert. Hier mal etwas Code:

Code:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
   Component content= null;

   [...]


   CellPanel cellPanel= new CellPanel(); //das Panel, das die Zelle darstellt
   [...]
   if (mustGetMarked){               
                Rectangle2D bounds= cellPanel.getBounds();
                
                if (cellPanel.getGraphics() != null){
                    cellPanel.getGraphics().drawLine((int)bounds.getX(), 
                            (int)bounds.getY(), 
                            (int)(bounds.getX() + bounds.getWidth()), 
                            (int)(bounds.getY() + bounds.getHeight()));    
                }                
   }
 
   return content;
}


Der Test
Code:
cellPanel.getGraphics() != null
in Zeile 13 wird jedoch nie true. Warum ist das so? Wie kann ich denn auf diesem Panel zeichnen?
 

AlArenal

Top Contributor
Indem du das Panel erweiterst... Man zeichnet nicht von außen in eine Komponente.

Außerdem kräuseln sich mir die Nackenhaare wenn ich sehe, dass der Renderer für jeden Durchlauf neue Instanzen erzeugt...
 

hupfdule

Top Contributor
AlArenal hat gesagt.:
Indem du das Panel erweiterst... Man zeichnet nicht von außen in eine Komponente.
Nun gut. Habe jetzt die paintComponent(Graphics) Methode überschrieben. Wirklich glücklich bin ich damit allerdings nicht. Diese Linie soll ja nur manchmal, gezeichnet werden, abhängig von den Werten des dargestellten Objekts. Nun muss ich diese Info dem CellPanel mitgeben, was dieses aber eigentlich nichts angeht.


Leider habe ich ein zweites Problem. Mein CellPanel beinhaltet 2 übereinander liegende opaque Labels. Siehe hier.
Damit wird die Linie leider unterhalb dieser, also direkt auf das Panel gezeichnet (in der linken oberen und rechten unteren Ecke sieht man je ein Stück der roten Linie.

Mein Ziel ist aber, dass die Linie in jedem Fall das am obersten gezeichnete Element ist. Hierzu auch noch die Labels ableiten, ist nicht gerade, was ich mir vorstelle. Wie kann ich das dennoch bewerkstelligen?

Außerdem kräuseln sich mir die Nackenhaare wenn ich sehe, dass der Renderer für jeden Durchlauf neue Instanzen erzeugt...
Mein Problem ist, dass je nach dem enthaltenen Wert des dargestellten Objekts u.U. andere Klassen die Komponente zeichnen. Also nicht nur die Klasse des Objekts ist der Anhaltspunkt, sondern teilweise auch der Inhalt. Wie kann ich das dennoch realisieren, dass ich die Komponenten nicht jedes mal neu erzeuge?
 

AlArenal

Top Contributor
Die gebräuchlichste Vorgehensweise für Renderer aller Art ist, dass sie keine Instanzen erzeugen, sondern sich selbst als Komponenten zurückliefern. Wenn ich nen Maler beauftrage mir erst das Haus A und dann das Haus B anzupinseln, stellt der ja nicht jedesmal Personal ein, lernt es an, entlässt es und macht dasgleiche Spiel ne Woche später nochmal.

Was du in deinem Renderer an Instanzen benötigst (Panel, Layouts, Label, was-weiß-ich) erzeugst du einmal und benutzt diese dann wieder. Im Fall der Label brauchst du doch nur ggf. Farbe oder Text neu setzen, aber doch nicht jedesmal ein neues Label erzeugen. Ich kauf mir auch nicht für jeden einzelnen Pinselstrich einen neuen Pinsel.
 

hupfdule

Top Contributor
AlArenal hat gesagt.:
Die gebräuchlichste Vorgehensweise für Renderer aller Art ist, dass sie keine Instanzen erzeugen, sondern sich selbst als Komponenten zurückliefern.
Ich weiß, da ich aber u.U. Instanzen verschiedener Objekte zurück liefere, wäre das nicht möglich. Vlt. kann ich aber von jeder Klasse eine Instanz vorhalten, die ich dann zurück liefern kann. Werde ich sehen. Werde das aber erst angehen, wenn Zeit dafür ist. Performanceprobleme hat es bisher nicht gebracht, daher hat es für mich keine hohe Priorität.

Dringender wäre für mich das Problem mit dem Zeichnen der Linie über die enhaltenen Labels. Hast du dafür vlt. einen Ansatzpunkt?
 

AlArenal

Top Contributor
Du musst keine "Instanzen verschiedener Objekte" zurückliefern. Lass den Renderer sich selbst zurückliefern und passe einfach nur diesen dynamisch an. Damit kannst du auch dein Linienproblem erschlagen: Einfach #paintComponent überschreiben und nach dem Aufruf der Super-Methode drüberzeichnen, was du magst (wenn du musst). Da brauchst du auch nix weiteres ableiten, nichts weitergeben oder sonstwas. Das handlest du alles im Renderer, dort hast du ja alle Infos, die du brauchst.
 

hupfdule

Top Contributor
AlArenal hat gesagt.:
Du musst keine "Instanzen verschiedener Objekte" zurückliefern.
Meinte natürlich Instanzen verschiedener Klassen (genauer: unterschiedlicher GUI-Komponenten). Der Grund ist, dass ich in manchen Fällen eben ein solches CellPanel benötige, in andern nur ein JLabel, in wieder anderen vlt. etwas ganz anderes. Der kleinste gemeinsame Nenner wäre da JComponent. Dann kann ich aber wirklich alles selbst zeichnen.

Damit kannst du auch dein Linienproblem erschlagen
Das Problem der Kapselung der Information wäre damit gelöst. Aber auch, dass die gezeichnete Linie unter den beiden Labels liegt? Kann ich mir grad nicht wirklich vorstellen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J getGraphics() vermeiden AWT, Swing, JavaFX & SWT 15
Q getGraphics() - NullPointerException AWT, Swing, JavaFX & SWT 8
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
hdi Swing Frage zu getGraphics() AWT, Swing, JavaFX & SWT 7
I getGraphics().setColor funktioniert nicht AWT, Swing, JavaFX & SWT 6
Kr0e Transparentes Image -> getGraphics AWT, Swing, JavaFX & SWT 8
C getGraphics() liefert nur null AWT, Swing, JavaFX & SWT 4
H wie, wenn nicht mit getGraphics ? AWT, Swing, JavaFX & SWT 10
B JPanel -> getGraphics() AWT, Swing, JavaFX & SWT 2
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
D LookAndFeel Überschreiben eines UIDelegate AWT, Swing, JavaFX & SWT 0
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
D TAB Taste innerhalb eines JSpinner AWT, Swing, JavaFX & SWT 2
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
F Swing Rotation eines Bildes mit beliebigen Koordinaten um den Mittelpunkt AWT, Swing, JavaFX & SWT 3
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
V JavaFX Teile eines Images Transparent machen AWT, Swing, JavaFX & SWT 4
I JavaFX Langes drücken eines Buttons AWT, Swing, JavaFX & SWT 4
B Swing Wie Witdh und Height eines GuiElements bekommen AWT, Swing, JavaFX & SWT 5
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
K Swing Inhalt eines JPanels lesen AWT, Swing, JavaFX & SWT 3
T Nur bestimmte Bereiche eines Fotos bearbeiten AWT, Swing, JavaFX & SWT 0
J Swing Erstellung eines User Interface AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
O Swing Aufbau eines JFrames AWT, Swing, JavaFX & SWT 2
A JavaFX Hilfe beim Design eines Quiz AWT, Swing, JavaFX & SWT 2
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
javampir Swing Wanderung eines JFrames AWT, Swing, JavaFX & SWT 7
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
S Swing Nur den sichtbaren Bereich eines TextPane mit Inhalt darstellem AWT, Swing, JavaFX & SWT 0
I Erstellung eines kleinen Programmes AWT, Swing, JavaFX & SWT 8
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
T Swing Einzelne Teile eines Textes färben? AWT, Swing, JavaFX & SWT 10
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
HaukeG JavaFX JavaFX Resize und DragAndDrop eines Pane AWT, Swing, JavaFX & SWT 4
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
J Denkfehler bei Aktualisierung eines GUI AWT, Swing, JavaFX & SWT 4
J Logikfehler im erstellen eines GUI AWT, Swing, JavaFX & SWT 3
F JTabbedPane mit Button zum Hinzufügen eines neuen Tabs AWT, Swing, JavaFX & SWT 6
B Event Handling Mausbewegung auch außerhalb eines JFrames registrieren AWT, Swing, JavaFX & SWT 2
U Swing Beim Bedienen eines Buttons JFrame schließen AWT, Swing, JavaFX & SWT 2
A Fehler bei erstellen eines JTextFields AWT, Swing, JavaFX & SWT 2
S Bestimmten Bereich eines Bildes im JFrame mit Scrollpane anzeigen AWT, Swing, JavaFX & SWT 0
C AWT die X koordinate eines Rectangles herrausfinden AWT, Swing, JavaFX & SWT 14
G 2D-Grafik Umrandung eines Winkels (drawArc(..)) AWT, Swing, JavaFX & SWT 4
V Ende eines Frames abwarten AWT, Swing, JavaFX & SWT 7
T hallo, habe ein Problem mit dem pro. eines Threads AWT, Swing, JavaFX & SWT 4
S Swing Auf Änderungen eines Models in der View einer JTable reagieren AWT, Swing, JavaFX & SWT 1
U Größe eines Button im Menü ändern AWT, Swing, JavaFX & SWT 1
B Größer-/Kleinerziehen eines JFrames/JPanels erkennen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben