Image in JTable einfügen

MarDaiBre

Aktives Mitglied
Hallo,

ich habe eine Tabelle, welche in eine andere Klasse zur PDF-Erstellung übergeben wird. Nun möchte ich, dass die Tabelle (1x1) als ColumnHeader einen Text und in die erste Zeile ein Image bekommt. Funktioniert alles bis auf die Anzeige des Bildes. Sämtliche Webergebnisse dazu haben mir nicht geholfen - ich erhalte immer Metadaten anstatt ein Bild. Welcher Zusatz fehlt mir denn da?

Java:
DefaultTableModel model = new DefaultTableModel(); 
model.addColumn("Fehlerort " + oid + " für Baureihe " + bid);
model.addRow(new Object[]{""});
			
JTable tabelle = new JTable(model); 		
tabelle.setValueAt(bufferedImageOptimized.getGraphics(), 0, 0);

Anbei einmal das Ergebnis aus der PDF. Vielen Dank für Tipps!
Unbenannt.PNG
 
Leider sagst du uns nicht was du schon probiert hast usw., daher werden vielleicht viele Vorschläge hier nochmals kommen.

[ot]
Warum verwendest du eine JTable die gerade mal 1x1 groß ist und bastelst dir nicht eine eigene Komponente dafür?
Wäre individueller und du hättest dieses Problem auch nicht 😉
[/ot]
 
Quick and dirty ginge es mit einem eigenen CellRenderer:

Java:
Icon icon = new ImageIcon(ImageIO.read(Start.class.getResource("/icon.png")));
		Icon[][] tableData = new Icon[][]{{icon}};
		
		JTable table = new JTable(tableData, new String[]{"Caption"});
		table.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer(){
			private JLabel label = new JLabel();
			@Override
			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
			{
				label.setIcon((Icon)value);
				return label;
			}
			
		});

EDIT:
Sind natürlich keine Ausnahmefehlerbehandlungen drin. z.b. wird hier davon ausgegangen, dass es mindestens eine Coloumn gibt und dass darin "Icon" Objekte liegen. Wird zu Problemem führen, sollten diese Vorraussetzungen einmal nicht gegeben sein...
 
Zuletzt bearbeitet:
Hallo,

@Joose: Ich habe eine Klasse, welche für andere Zwecke im gleichen Programm eine PDF erstellt und als Inhalt eine Tabelle verlangt. Um das Bestehende wiederverwenden zu können, war das die (zumindest mein Gedanke) einfachste Lösung und wird (wenn es denn klappt) auch optisch vollkommen ausreichend sein.

@X5-599: Danke, ich habe dein Beispiel mal ausprobiert, erhalte aber auch hier kein Bild. Wo das Bild sein sollte, erhalte ich "javax.swing.ImageIcon@...". :-(
 
Wie sieht denn dein Code mit den Änderungen aus? Hast du mal versucht mein Beispiel mit einem neuen Frame zu benutzen? Denn wenn ich das bei mir ausführe sehe ich ein Bild. Und wenn du wieder nur ""javax.swing.ImageIcon@.." siehst hiesse das, dass der Renderer nicht überschrieben wurde und noch der Standard Renderer aktiv ist.
 
Hier einmal mein Code mit angepasstem Renderer:
Java:
public void actionPerformed (ActionEvent e)
	{
		Object source = e.getSource();
		if (source == print)
		{			
			/*
			DefaultTableModel model = new DefaultTableModel(); 
			model.addColumn("Fehlerort " + oid + " für Baureihe " + bid);
			model.addRow(new Object[]{""});
			
			JTable tabelle = new JTable(model); 
			
			tabelle.setValueAt(bufferedImageOptimized.getGraphics(), 0, 0);
			*/
			
			Icon ic = new ImageIcon(bufferedImageOptimized);
			Icon[][] tableData = new Icon[][]{{ic}};
			
			JTable tabelle = new JTable(tableData, new String[]{"Fehlerort " + oid + " für Baureihe " + bid});
			tabelle.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer(){
				private JLabel label = new JLabel();
				@Override
				public Component getTableCellRendererComponent(JTable tabelle, Object value, boolean isSelected, boolean hasFocus, int row, int column)
				{
					label.setIcon((Icon)value);
					return label;
				}
			});
			
			JFileChooser fc = new JFileChooser("."); // Durch "." wird das Arbeitsverzeichnis gewaehlt.
			int returnValue = fc.showSaveDialog(Fehleranzeige.this);
			if (returnValue == JFileChooser.APPROVE_OPTION)
			{
				setCursor(new Cursor(Cursor.WAIT_CURSOR));
				File datei = fc.getSelectedFile();
				ReportPDF pdf = new ReportPDF(datei.getAbsolutePath(), tabelle, text);
		        setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
			}
		}
		
		else if (source == schliessen)
			setVisible (false);
	}
 
ich vermute mal, dass der Report Generator nur die Objekte aus dem TableModel holt und .toString() darauf aufruft (Also gar nicht über die Renderer geht)... Siehst du das Bild wenn du sowas in deine actionPerformed einbaust?

Java:
JDialog dialog = new JDialog();
dialog.add(tabelle);
dialog.setVisible(true);
 
Hey, ja dann erhalte ich ein neues Frame mit dem Bild, jedoch ohne den Tabellenrahmen und ohne Spaltenüberschrift, also nur das reine Bild. D. h. ich muss die Klasse für die Reporterstellung anpassen?
 
Ich denke mal schon. Ach ich sehe gerade, wenn du statt
Code:
dialog.add(tabelle)
einfach
Code:
dialog.add(new JScrollPane(tabelle));
schreibst, wird auch die Titelzeile angezeigt.
 

Zurück
Oben