Swing TableCellRenderer: setText() vs. setIcon()

Curry

Aktives Mitglied
Hallo!

Ich habe einen TableCellRenderer geschrieben, der ein Icon in einer Tabelle anzeigen soll. Wenn es die Bilddatei zu dem Icon jedoch nicht gibt, dann soll der Wert der Zelle als Text angezeigt werden.

Doch, wenn das Bild zu einem bestimmten Text nicht vorhanden ist, dann wird dieser Text in jeder Zeile dieser Spalte neben dem Icon angezeigt. Und in den Zeilen, in denen eigentlich nur der Text angezeigt werden sollte, wird irgendein anderes Icon zusammen mit dem eigentlichen Text angezeigt.

Hat jemand eine Idee?

Java:
public class PositionCellRenderer extends JLabel implements TableCellRenderer {

	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

		this.setOpaque(true);

		File f = new File("d:/test/pics/position/pos" + value.toString() + ".png");

		if(f.isFile()) {
			ImageIcon icon = new ImageIcon("d:/test/pics/position/pos" + value.toString() + ".png");
			setIcon(  icon );
		}
		else {
			setText( value.toString() );
		}

		if (isSelected) {
			setForeground( new Color(255, 255, 255) );
			setBackground( new Color(90,130,40) );
		}
		else {
			setForeground( new Color(255, 255, 255) );

			if(row % 2 > 0) {
				if(column % 2 > 0) {
					setBackground(new Color(50,90,20));
				}
				else {
					setBackground(new Color(60,100,30));
				}
			}
			else {
				if(column % 2 > 0) {
					setBackground(new Color(30,70,10));
				}
				else {
					setBackground(new Color(40,80,20));
				}
			}

		}
		return this;
	}
}
 

Blakh

Bekanntes Mitglied
Wenn ich mich jetzt nicht täusche:

du legst immer eine Datei an

Java:
File f = new File("d:/test/pics/position/pos" + value.toString() + ".png");

Damit kommst du doch nie in den else-Zweig. Was du machen willst ist doch nur ein icon aus einer vorher schon bestehenden Datei laden, oder?

Ich hab das so gemacht:

Java:
URL fileUrl = getClass().getResource(DATEINAME);
ImageIcon icon;

if(fileUrl != null ) {
      ico = new ImageIcon(fileUrl);
}
 

Curry

Aktives Mitglied
Was du machen willst ist doch nur ein icon aus einer vorher schon bestehenden Datei laden, oder?
Genau das möchte ich machen und für den Fall, dass es ein Bild nicht gibt, soll er den Text anzeigen.

Wenn ich es so mache, dann wird immer der else-Zweig genommen und der Wert als Text angezeigt.

Java:
URL fileUrl = getClass().getResource("d:/test/pics/position/pos" + value.toString() + ".png");
		ImageIcon icon;

		if(fileUrl != null ) {
			icon = new ImageIcon(fileUrl);
		}
		else {
			setText( value.toString() );
		}
 

Blakh

Bekanntes Mitglied
Dein Pfad stimmt nicht. Mit getClass().getResource() verwendest du den relativen Pfad deiner Klasse. Liegt deine Datei genau in dem Ordner, wo du auch deine Source-Datei der Klasse liegt reicht z.b. "pos" + value.toString() + ".png" . (Evtl. auch mit / davor).

Vergiss nicht auch das icon zu setzen.

Ansonsten nimm mal bei deinem ursprünglichen Code anstatt .isFile() .exists()
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Wenn Du den ersten Code nimmst, musst Du natürlich die Renderer Komponente immer in den Zustand versetzen den Du benötigtst - bedenke, dass immer wieder die selbe Komponten zum Zeichnen der Zelle verwendet wird. Wenn in der Zelle zuvor ein Icon gesetzt wurde und in der Zelle danach keines gesetzt werden soll, musst Du das bisherige Icon wieder entfernen.
Java:
if(f.isFile()) {
            ImageIcon icon = new ImageIcon("d:/test/pics/position/pos" + value.toString() + ".png");
            setIcon(  icon );
            setText("");
}
else {
            setIcon(null);
            setText( value.toString() );
}
Ansonsten in der Renderermethode nicht dauernd neue Objekte erzeugen, d.h. alle benötigten Bilder einmal bei der Initialisierung des Renderers laden, genauso das erzeugen der Farb Objekte.
Die String-Icon-Zuordnung kann man in einer Map speichern, oder man verwendet direkt eigene Objekte im TableModel.
 

Curry

Aktives Mitglied
Vielen Dank für die wertvollen Erläuterungen und Tipps!

Jetzt funktioniert es sehr schön und ich habe auch die Sache mit der initialisierung der Variablen umgestellt.

Hattest du es so gemeint?

Nun schaut es so aus:
Java:
public class PositionCellRenderer extends JLabel implements TableCellRenderer {

	private Color colorEvenEven		= new Color(40,80,20);
	private Color colorEvenUneven	= new Color(30,70,10);

	private Color colorUnevenEven	= new Color(60,100,30);
	private Color colorUnevenUneven = new Color(50,90,20);

	private Color colorForeground	= new Color(255, 255, 255);

	private Color colorSelected		= new Color(90,130,40);

	private HashMap<Integer, ImageIcon> icons;
	private int s = 0;
	private int n = 0;

	/**
	 * Der Konstruktor des CellRenderers wird nur einmal für alle Zellen aufgerufen. 
	 */
	public PositionCellRenderer() {
		s++;
		System.out.println("start = " + s);

		icons = new HashMap<Integer, ImageIcon>();

		File dir = new File("d:/test/pics/position/");
		File[] files = dir.listFiles();

		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				if (files[i].isFile() && files[i].getName().startsWith("pos")) {
					String filename		= files[i].getName();
					String substring	= filename.substring(3, filename.length() - 4);
					icons.put(Integer.parseInt(substring), new ImageIcon( files[i].getAbsolutePath() ));
				}
			}
		}
	}

	/*
	 * Da es für alle Zellen in der Tabelle, für die dieser CellRenderer definiert wurde, nur ein Objekt dieses CellRenderers gibt,
	 * wird diese Methode immer in demselben Objekt aufgerufen.
	 */
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

		n++;
		System.out.println("getTableCellRendererComponent -> " + n + " -> " + row + " / " + column + " -> " + isSelected);
		
		this.setOpaque(true);
		this.setHorizontalAlignment(JLabel.CENTER);

		if(icons.containsKey( (Integer) value )) {
			setIcon( icons.get( (Integer) value ) );
			setText( "" );
		}
		else {
			setIcon( null );
			setText( value.toString() );
		}

		if (isSelected) {
			setForeground( colorForeground );
			setBackground( colorSelected );
		}
		else {
			setForeground( colorForeground );

			if(row % 2 > 0) {
				if(column % 2 > 0) {
					setBackground( colorUnevenUneven );
				}
				else {
					setBackground( colorUnevenEven );
				}
			}
			else {
				if(column % 2 > 0) {
					setBackground( colorEvenUneven );
				}
				else {
					setBackground( colorEvenEven );
				}
			}

		}
		return this;
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B TableCellRenderer rendert Integer/Boolean Felder nicht AWT, Swing, JavaFX & SWT 4
M Swing TableCellRenderer elegant anpassen AWT, Swing, JavaFX & SWT 3
D Swing Mit TableCellRenderer einzelne Zellen markieren AWT, Swing, JavaFX & SWT 3
O Swing TableCellRenderer und JComboBox AWT, Swing, JavaFX & SWT 4
E Swing TableCellRenderer für alle Splaten setzen?! AWT, Swing, JavaFX & SWT 3
M gleicher TableCellRenderer für mehrere unterschiedliche Tabellen AWT, Swing, JavaFX & SWT 5
A Swing TableCellRenderer ändert die Zeilenfarbe zu spät AWT, Swing, JavaFX & SWT 3
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
J NullPointerException bei Benutzung vom TableCellRenderer AWT, Swing, JavaFX & SWT 3
U TableCellRenderer: Problem mit Timestamp/Date AWT, Swing, JavaFX & SWT 2
U TableCellRenderer UND prepareRenderer AWT, Swing, JavaFX & SWT 12
C Swing TableCellRenderer AWT, Swing, JavaFX & SWT 10
U TableCellRenderer und setBackground AWT, Swing, JavaFX & SWT 20
H Swing TableCellRenderer für verschiedene Spalten AWT, Swing, JavaFX & SWT 11
C Swing Problem mit TableCellRenderer in Verbindung mit TableRowSorter AWT, Swing, JavaFX & SWT 2
R JTable - TableCellRenderer AWT, Swing, JavaFX & SWT 3
R JTable - TableCellRenderer - BufferedImage AWT, Swing, JavaFX & SWT 9
S TableCellRenderer: JLabel-Background in JPanel AWT, Swing, JavaFX & SWT 7
R JTable mit TableCellRenderer AWT, Swing, JavaFX & SWT 10
R JTable - TableCellRenderer AWT, Swing, JavaFX & SWT 2
D TableCellRenderer rendert einfach nicht! AWT, Swing, JavaFX & SWT 4
S TableCellRenderer setForeground AWT, Swing, JavaFX & SWT 5
I Problem mit TableCellRenderer AWT, Swing, JavaFX & SWT 3
K TableCellRenderer Problem AWT, Swing, JavaFX & SWT 3
F TableCellRenderer wie umsetzen? AWT, Swing, JavaFX & SWT 2
D JTable TableCellRenderer AWT, Swing, JavaFX & SWT 2
J JTable und TableCellRenderer AWT, Swing, JavaFX & SWT 2
G TableCellRenderer Background variiert darstellen AWT, Swing, JavaFX & SWT 3
P TableCellRenderer mit einem TableRowSorter AWT, Swing, JavaFX & SWT 4
D TableCellRenderer PRoblem AWT, Swing, JavaFX & SWT 3
G TableCellRenderer soll ganze ausgewählte Zeile markieren AWT, Swing, JavaFX & SWT 2
S TableCellRenderer deaktivieren AWT, Swing, JavaFX & SWT 13
J TableCellRenderer AWT, Swing, JavaFX & SWT 5
S JTree mal anders (TableCellRenderer) AWT, Swing, JavaFX & SWT 6
S TableCellRenderer, Performance AWT, Swing, JavaFX & SWT 9
M Objekt in TableCellRenderer packen, warum ein Fehler? AWT, Swing, JavaFX & SWT 2
T TableCellRenderer Problem AWT, Swing, JavaFX & SWT 6
B TableCellRenderer + JComboBoxen AWT, Swing, JavaFX & SWT 2
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
zhermann NullPointerException bei Label.setText() AWT, Swing, JavaFX & SWT 5
C JavaFX mit .setText() befülltes Textfield liefert anschließend mit .getText() den ursprünglichen Wert? AWT, Swing, JavaFX & SWT 1
it_is_all jLabel.setText -> Char in Str: NullpointerException AWT, Swing, JavaFX & SWT 1
J Swing JTextpane aktuallisiert nicht den setText? AWT, Swing, JavaFX & SWT 9
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
K JavaFX RadioButton.setText() AWT, Swing, JavaFX & SWT 11
Z Window Builder - Labels mit setText befüllen AWT, Swing, JavaFX & SWT 11
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
A Textfeld.append/.setText ohne Funktion AWT, Swing, JavaFX & SWT 2
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
A editable JTextField & setText AWT, Swing, JavaFX & SWT 2
A Minimalestopuhr: JLabel.setText() durch eigenes Event ändern AWT, Swing, JavaFX & SWT 6
P Swing JtextArea füllen mit setText AWT, Swing, JavaFX & SWT 7
J Swing JTextField reagiert nicht auf .setText(); AWT, Swing, JavaFX & SWT 24
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
G Menü verschwindet durch .setText() AWT, Swing, JavaFX & SWT 4
T Swing setText()-Methode Funktioniert nicht AWT, Swing, JavaFX & SWT 7
L JLabel Methode setText funktioniert nicht AWT, Swing, JavaFX & SWT 5
E JTextPane setText ignoriert \n AWT, Swing, JavaFX & SWT 6
A Swing JFrame vergrößert sich immer bei setText() eines Labels AWT, Swing, JavaFX & SWT 3
S Swing JLabel.setText und Multithreads AWT, Swing, JavaFX & SWT 5
B AWT Problem bei setText() AWT, Swing, JavaFX & SWT 5
S [Button] setText("String") AWT, Swing, JavaFX & SWT 5
E Swing JLabel ändert seine Position nach setText AWT, Swing, JavaFX & SWT 2
S Swing jTextPaine kein Zeilenumbruch nach setText() AWT, Swing, JavaFX & SWT 9
L JLabel.setText() AWT, Swing, JavaFX & SWT 8
T Von JMenuItem setText auf JButton AWT, Swing, JavaFX & SWT 2
T JLabel.setText() funktioniert erst nach repaint() etc.? AWT, Swing, JavaFX & SWT 4
B setText() auf TextField mit Document AWT, Swing, JavaFX & SWT 2
X JTextArea Text ausgeben mit setText(a) aber wie? AWT, Swing, JavaFX & SWT 3
G Methode setText AWT, Swing, JavaFX & SWT 4
B Label mit setText geschriebener Text wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
Z Die ausgabe.setText(b.getisbn()); überschreibt sich jedesmal AWT, Swing, JavaFX & SWT 4
M JLabel und setText(); AWT, Swing, JavaFX & SWT 4
Z jLabel.setText("Name: " + x.getName()); --> AWT, Swing, JavaFX & SWT 6
P Fehlerhafte Darstellung bei JLabel.setText AWT, Swing, JavaFX & SWT 2
V Null Pointer Exception bei JTextField setText AWT, Swing, JavaFX & SWT 25
D setText? AWT, Swing, JavaFX & SWT 4
M x.setText("") auf JLabel AWT, Swing, JavaFX & SWT 18
S JEditorPane setText() Problem mit String übergeben AWT, Swing, JavaFX & SWT 3
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
B setIcon AWT, Swing, JavaFX & SWT 13
F setIcon wird erst nach der methode ausgeführt AWT, Swing, JavaFX & SWT 4
G Problem mit JLabel und setIcon AWT, Swing, JavaFX & SWT 5
R setIcon löst Fehler aus AWT, Swing, JavaFX & SWT 4
G Problem mit label.setIcon AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben