JTable mit Text UND Icon in einer Zelle

superping

Aktives Mitglied
Hallo zusammen!

Wie der Titel bereits erwähnt, möchte ich in einer Zelle einer JTable einen Text UND ein Icon einfügen.
Ich habe schon gegoogelt, finde aber immer nur die entweder oder Variante.

Die Tabelle wird mit Daten aus der DB per Vectoren gefüllt.

Hier der Code:

Java:
tTableModel = new DefaultTableModel(7, 1);

...
tourTable = new JXTable(tTableModel){

public Component prepareRenderer(
                TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                c.setFont(Bork.labelFont1);
                if (column == 1 ^ column == 2 ) {
                        c.setFont(Bork.normalFont);
                        }
                if (!isRowSelected(row)) {
                        String type = (String)getModel().getValueAt(row, 0);
                        c.setBackground(row % 2 == 0 ? null : Color.LIGHT_GRAY );
                        }
                if (isRowSelected(row) && isColumnSelected(column))
                        ((JComponent)c).setBorder(null);
                return c;
            }
};
 
Hallo

Uh, das ist schon eine weile her und ich hab den Code gerade nicht zur Hand, aber kannst du nicht den Component c als JLabel definieren und dann dort Icon und Text setzen? irgendwie so gehts glaub ich 😛 Ich bin mir nicht mehr sicher obs im Table Model oder im Table Renderer gemacht werden muss...

mfg
 
Guten Abend! ^^

Danke erstmal für Deine Antwort!

Das genau ist ja das Problem: ich weiss nicht wie ich Jcomponent als JLabel definieren kann (Anfänger). Ob das im TableModel oder im Renderer gemacht wird kann ich dann ziemlich schnell rausfinden.

JLabel mit Text und Icon ist ja auch kein Problem.

Wäre toll wenn Du da noch iwo Codeschnipsel hättest. 🙂
 
Hallo

Einfach mal ein Versuch 😉

Java:
Component c = super.prepareRenderer(renderer, row, column);
Gibt dir sehr wahrscheinlich das Textfeld zurück welches Standardmässig verwendet wird. Du kannst nun einfach den Komponenten setzen wie du willst, also statt des obigen Codes schreibst du
Java:
Component c = new JLabel();
c.setText(...);
c.setIcon(...);
Da JLabel von Component stammt sollte das also möglich sein (was von was abstammt siehst du hier)

Nun gibt deine prepareRenderer()-Methode als Komponenten das JLabel an die Tabelle zurück jedes mal wenn die Tabelle die Funktion aufruft. Somit kannst du die Zellen anpassen, auch mit anderen Komponenten.

mfg
 
Du musst (und solltest) J(X)Table nicht überschreiben, nur um Zellen anders zu rendern.

So mache ich das immer:
Java:
package org.javaforum.bsp;

import java.awt.BorderLayout;
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class TableRendererTut {

	public static void main(String[] args) {
		
		// Tablemodel
		Object[][] tableData = new Object[][] {
				"1:apfel:grün".split(":"), "2:erdbere:rot".split(":"), "3:zitrone:gelb".split(":")
		};
		Object[] columnNames = new Object[] {
				"id", "name", "farbe"
		};
		DefaultTableModel tableModel = new DefaultTableModel(tableData, columnNames);
		
		// TableCellRenderer
		TableCellRenderer idRenderer = new DefaultTableCellRenderer() {
			
			@Override
			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
					int row, int column) {
				
				super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
				
				setIcon(UIManager.getIcon("OptionPane.informationIcon"));
				
				return this;
			}
		};

		// Table with Model + Renderer
		JTable table = new JTable(tableModel);
		table.setAutoCreateColumnsFromModel(false);
		table.setRowHeight(40);
		
		table.getColumnModel().getColumn(0).setCellRenderer(idRenderer);
		

		// bsp frame
		JFrame frame = new JFrame("TableRendererTut");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.setLayout(new BorderLayout());
		frame.add(new JScrollPane(table), BorderLayout.CENTER);

		frame.setSize(800, 600);
		frame.setLocationByPlatform(true);

		frame.setVisible(true);

	}
}
 
Vielen Dank euch beiden! (hat etwas gedauert bis ich das probieren konnte^^)

Habe es jetzt mit einem JLabel hinbekommen. Ist die superbequeme Lösung für mich.

Heeerzlichen!
 

Neue Themen


Zurück
Oben