Swing JTable: in erster Spalte Image darstellen

Status
Nicht offen für weitere Antworten.

Souljumper

Aktives Mitglied
Ich such ein Beispiel wie ich in einer JTable in der ersten Spalte ein Image darstellen kann - oder generell ein Image.

Hab mir da jetzt dieses Beispiel gegoogelt, aber das funktioniert leider nicht. Gibts irgendwo funktionierende Beispiele oder kann mir wer sagen was hier nicht funktioniert.

Java:
import java.awt.BorderLayout;
import java.awt.Component;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;

public class t {
  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(new BorderLayout());

    MyTableModel model = new MyTableModel();

    JTable table = new JTable(model);
    table.setRowHeight(80);
    table.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());
    JScrollPane pane = new JScrollPane(table);
    frame.getContentPane().add(BorderLayout.CENTER, pane);
    frame.setSize(500, 400);
    frame.setVisible(true);
  }
}

class MyTableModel extends AbstractTableModel {
  public Object getValueAt(int row, int column) {
    return "" + (row * column);
  }

  public int getColumnCount() {
    return 4;
  }

  public int getRowCount() {
    return 5;
  }
}

class ImageRenderer extends DefaultTableCellRenderer {
  JLabel lbl = new JLabel();

  ImageIcon icon = new ImageIcon(getClass().getResource("sample.png"));

  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    lbl.setText((String) value);
    lbl.setIcon(icon);
    return lbl;
  }
}
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Wenn das Beispiel nicht funktioniert, dann liegt's wahrscheinlich daran, dass einfach "sample.png" nicht gefunden wird.
Java:
getClass().getResource("sample.png")
^^ Hier wird die Resource "sample.png" relativ zum package der Klasse über den CLASSPATH geladen. Das bedeudet, die Datei muss im selben Packet zu finden sein.

Anmerkung: Java-Klassen beginnen mit großem Buchstaben: CamelCase.

Ebenius
 

Souljumper

Aktives Mitglied
aua....ich Doofnase.

Noch eine Frage, das Bild funktioniert jetzt wunderbar - ABER, ich hab das Zeilenweise Highlighting aktiviert. Dadurch das jetzt ein label vermutlich "über" der zeile hängt wird jetzt beim drauf klicken die ganze zeile gehighlighted....bis auf die spalte wo das bild/label jetzt drüber hängt.

Wie krieg ich das gelöst, kann ich da label irgendwie in den hintergrund zwingen oder highlightbar machen ?
 

Ebenius

Top Contributor
Deine Vermutung mit Vorder- oder Hintergrund kann so nicht ganz stimmen. Was meinst Du genau mit "zeilenweise Highlighting"? Mach mal nen Screenshot und häng ihn an den nächsten Beitrag an (Antworten ==> "Anhänge Verwalten" (unten))

Ebenius
 

Souljumper

Aktives Mitglied
habs mal angehängt

die markierte zeile (blau) wird zwar markiert wenn man sie anklickt, allerdings die spalte wo die bilder drin sind nicht. Wie krieg ich hin das die spalte auch markiert ist wenn ich die zeile anklicke? ?
 

Anhänge

  • Untitled-1.jpg
    Untitled-1.jpg
    76,1 KB · Aufrufe: 65

Schandro

Top Contributor
Wie die Zelle aussieht entscheidest du doch in der Methode getTableCellRendererComponent im TableCellRenderer, als Parameter wird dir ja mitgegeben ob sie selektiert ist..
 

Ebenius

Top Contributor
Bau mal in Zeile 50 das ein: [Java]super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);[/code]
Ebenius
 

Souljumper

Aktives Mitglied
da bekomme ich dann ja ein Component-Objekt zurück - das der oberklasse, das hat ja das image nicht in der spalte. das was ich dann bekomme ist das normale zeilenverhalten, dann funktioniert auch das highlighting.

ich will das bild schon behalten, nur es erreichen das dieses mit markiert wird.
hier mal meine cellrender klasse
Java:
public class CellRenderer extends DefaultTableCellRenderer 
{
	JLabel center	 = new JLabel();
	JLabel fill1	 = new JLabel(); //Platzhalter linker Rand der Zelle
	JLabel fill2	 = new JLabel(); //Platzhalter rechter Rand der Zelle
	JLabel buchLabel = new JLabel(); //Label das das Buchimage aufnimmt
	Blob   cover;
	
	CellRenderer()
	{
		super();
	}
	
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
		      boolean hasFocus, int row, int column) 
	{
		
		center.setLayout(new FlowLayout());
		center.add(fill1);

		cover = ((CustomTableModel)table.getModel()).getBlobForPos(row);
		try {buchLabel.setIcon(new ImageIcon(cover.getBytes(1L, (int) cover.length())));}
		catch (SQLException e) {e.printStackTrace();}
		
		center.add(buchLabel, BorderLayout.CENTER);
		center.add(fill2);
		return center; //center ist dann das label mit dem zentrierten cover in der mitte
	}

}

Das zuweisen mach ich dann an meine JTable so
Java:
		getColumnModel().getColumn(0).setCellRenderer(render);
(wobei hier render das CellRender - Ojbekt ist)
 
Zuletzt bearbeitet von einem Moderator:

Schandro

Top Contributor
Du kannst das Component Object was du zurück bekommst auf nen JLabel casten und dein Image draufsetzen und erst dann zurckgeben ;)
 

Ebenius

Top Contributor
Ach herrje. Den Renderer-Quelltext oben hab ich mir gar nicht so genau angesehen. Der ergibt nicht so recht Sinn. Der DefaultTableCellRenderer leitet doch schon von JLabel ab und gibt bei getTableCellRendererComponent(...) this zurück. Daher braucht er keinen Member vom Typ JLabel mehr. Also mach's einfach so:
Java:
class ImageRenderer extends DefaultTableCellRenderer {
 
  ImageIcon icon = new ImageIcon(getClass().getResource("sample.png"));
 
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    setIcon(icon);
    return this;
  }
}
Fertig.

PS: Bitte für Java-Quelltext [noparse]
Java:
[/noparse]-Tags benutzen, nicht [noparse][code][/noparse]-Tags. Hab ich bei Dir schnell geändert; also nur für's nächste mal.

Ebenius
 

Souljumper

Aktives Mitglied
Wie hässlich sollte es denn planmäßig sein? ;)

SCNR, Ebenius

ich find das nicht häßlich :eek:

Aber in der Zelle steht eigentlich noch ein Text, der Buchtitel, der wrude bisher nicht mit angezeigt. Mit der Änderung jetzt hab ich ungewollt auch wieder den Text sichtbar. Das wäre mein nächster Schritt gewesen den Titel neben das Buch zu holen. Hat sich ja jetzt automatisch gelöst :)

btw.
Können JTables kein Zeilenumbrüche? Wenn ich \n in einem String hab und den i eine Zelle setze wird der Text leider nicht umgebrochen.
 

Ebenius

Top Contributor
ich find das nicht häßlich
Hast den Witz nicht verstanden. ;)

Können JTables kein Zeilenumbrüche? Wenn ich \n in einem String hab und den i eine Zelle setze wird der Text leider nicht umgebrochen.
Das Prinzip wie die JTable arbeitet hast Du auch noch nicht ganz verstanden. Eine JTable kann fast nichts. Sie kann ein Raster aus Zellen zeichnen (also die Striche) und Renderer-Komponenten in Zellen zeichnen lassen. Die Frage, ob JTables Zeilenumbrüche können, ist ziemlich ungünstig.

Die Frage muss heißen: "Können die Standard-CellRenderer Zeilenumbrüche."
Die Antwort ist: "Ja und nein". Die Standard-Renderer sind (in diesem Kontext) nichts anderes als konfigurierte JLabels. Jede Zelle kann also mit dem Standard-Renderer genau das zeichnen was ein JLabel kann. Ein JLabel kann keine Zeilenumbrüche mit plain Text (das ist das "nein"). "\n" funktioniert also nicht. Allerdings (hier nun das "ja") können JLabels HTML darstellen. Damit kann man Zeilenumbrüche machen. Alternativ kann man auch einen eigenen TableCellRenderer implementieren, der zum Beispiel eine JTextArea zum Darstellen nutzt.

Lies Dir mal das Sun Java™ Tutorial: How to Use Tables durch.

Ebenius
 

Souljumper

Aktives Mitglied
ganz schön tricky, aber ich hab gesehen es gibt ein TableRenderer Interface, ich bin vorhin hergegangen und hab das geerbt von der DefaultTableCellRenderer Klasse. Man soll ja vererben vermeiden wenn es interfaces gibt die diese funktion erfüllen.

Hab mir mal versuch eine Klasse zu erstellen die mit implements TableRenderer das selbe macht wie die, die den default-renderer erbt. Nun komm ich wieder soweit das alles dargestellt wird, nur das markieren wieder bei dem JLabel nicht klappt. Die zeile wird also markeirt nur die erste spalte mit meinem JLabel nicht.

Hab jetzt versucht mir von dem DefaultTableCellRenderer die Informationen zu holen die ich mir zuvor von der super-Klasse geholt hab. Jetzt funktioniert zwar das mit dem markieren, dafür hab ich jetzt in jede Spalte das Buch-Cover drin...

wie muss ich das machn wenn ich ohne super-klasse arbeite?

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

		buchLabel = (JLabel) table.getDefaultRenderer(table.getColumnClass(1)).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
		
		/* Laden des Covers für Zeile "row" */
		cover = ((CustomTableModel)table.getModel()).getBlobForPos(row);
		
		/* Bild-Cover als Icon-Symbol setzen */
		try {buchLabel.setIcon(new ImageIcon(cover.getBytes(1L, (int) cover.length())));}
		catch (SQLException e) {e.printStackTrace();}
		
//		buchLabel.setFont(new Font("VERDANA",Font.BOLD, 14));
//		buchLabel.setText((String)((CustomTableModel)table.getModel()).getValueAt(row, column));
		
		
		
		return buchLabel;
	}
 

Ebenius

Top Contributor
Man soll ja vererben vermeiden wenn es interfaces gibt die diese funktion erfüllen.
Wie kommst Du darauf? Man soll beim Design Funktionalitäten so voneinander trennen, dass man nicht jede Änderung über Vererbung lösen muss. Aber man sollte ganz sicher fertige Klassen die man nur leicht modifizieren muss einer kompletten Neuimplementation vorziehen. Ergo: Mach das nicht; nimm die Klasse wie oben beschrieben.

Ebenius
 

Souljumper

Aktives Mitglied
ok,

aber wenn ich den Zeilenumbruch haben will, muss ich ja für die reinen Text-Spalten auch einen seperaten Cellrenderer definieren. Wenn ich diesen CellRenderer von TextArea erben lassen will um die Zeilenumbruchfunktion zu bekommen, dann kann ich nicht mehr vom DefaultRenderer Modell erben.

Das Problem hab ich jetzt...und jetzt dreh ich mich im Kreis.

EDIT:
Jetzt brennts an zwei Stellen, ich setze mir den Tooltip für jede Zelle in dieser Methode
Java:
    public Component prepareRenderer(TableCellRenderer renderer,int row, int col) 
    {
        Component comp = super.prepareRenderer(renderer, row, col);
        JComponent jcomp = (JComponent)comp;
        if (comp == jcomp) 
          jcomp.setToolTipText((String)getValueAt(row, col));
        return comp;
     }

Mit dieser TextRendererKlasse als TableCellRenderer funktioniert das aber nicht
Java:
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column)
	{
		textArea = (JTextArea)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
		
		//this.add((JLabel) table.getDefaultRenderer(table.getColumnClass(1)).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column));
		textArea.setFont(new Font("VERDANA",Font.BOLD, 14));
		textArea.setText("blali\nbloblas");
		
		return textArea;
	}

da entsteht ne class-cast exception, die ich nnicht nachvollziehen kann. der renderer erbt doch von dem DefaultRenderer
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
aber wenn ich den Zeilenumbruch haben will, muss ich ja für die reinen Text-Spalten auch einen seperaten Cellrenderer definieren. Wenn ich diesen CellRenderer von TextArea erben lassen will um die Zeilenumbruchfunktion zu bekommen, dann kann ich nicht mehr vom DefaultRenderer Modell erben.
Warum nicht einfach so?
Java:
/* table model */
final AbstractTableModel model = new AbstractTableModel() {

  public Object getValueAt(int rowIndex, int columnIndex) {
    switch (columnIndex) {
    case 0:
      return "ABC";
    default:
      return "ABC\nDEF";
    }
  }

  public int getRowCount() {
    return 10;
  }

  public int getColumnCount() {
    return 2;
  }

  @Override
  public Class<?> getColumnClass(int columnIndex) {
    return String.class;
  }
};

/* table w/ multi line renderer */
final JTable table = new JTable(model);
table.setDefaultRenderer(String.class, new DefaultTableCellRenderer() {

  private JTextArea area = new JTextArea();

  @Override
  public Component getTableCellRendererComponent(
        JTable table,
        Object value,
        boolean isSelected,
        boolean hasFocus,
        int row,
        int column) {
    super.getTableCellRendererComponent(table, value, isSelected,
          hasFocus, row, column);
    area.setText((String) value);
    area.setBorder(getBorder());
    area.setForeground(getForeground());
    area.setBackground(getBackground());
    area.setFont(getFont());

    return area;
  }
});

/* determine row height */
final int col = table.convertColumnIndexToView(1);
final TableCellRenderer renderer = table.getCellRenderer(1, col);
final Component component = table.prepareRenderer(renderer, 1, col);
table.setRowHeight(component.getPreferredSize().height);

/* show test frame */
final JFrame f = new JFrame("Test Frame: Multi Line Text Cell Renderer");
f.setContentPane(new JScrollPane(table));
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
Ebenius
 

Souljumper

Aktives Mitglied
ok danke,

ich bin jetzt auf einen andere Trichter gekommen
Java:
	       setForeground(t.getSelectionForeground());
	       setBackground(t.getSelectionBackground());

damit setzt man die selektion der tabelle für die componente, da noch eine if-else drum und das isSelected geprüft dann klappt das.

Bin jetzt fast am Ziel. Mein Problem ist jetzt wieder die Spalte mit dem Bild drin, wenn ich den Text (Titel des Buches) hardkodiert mit setText setze sehe ich den Text in der Spalte neben dem Bild. Versuch ich den Text dynamisch zur Lafuzeit zu setzen sehe ich nichts. Auch das fireTableCellUpdate hilft da nicht.

Java:
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
		      boolean hasFocus, int row, int column) 
	{
		setHighlight(isSelected, this, table);
		setHighlight(isSelected, textPane, table);
		/* Laden des Covers für Zeile "row" */
		cover = ((CustomTableModel)table.getModel()).getBlobForPos(row);
		
		/* Bild-Cover als Icon-Symbol setzen */
		try {buchLabel.setIcon(new ImageIcon(cover.getBytes(1L, (int) cover.length())));}
		catch (SQLException e) {e.printStackTrace();}
		
		textPane.setFont(new Font("VERDANA",Font.BOLD, 14));
		String s = (String) ((CustomTableModel)table.getModel()).getValueAt(row, column);
		textPane.setText(s); //funktioniert nicht - textPane.setText("bla\nbla") funktioniert aber
		this.add(buchLabel);
		this.add(textPane);
		((CustomTableModel)table.getModel()).fireTableCellUpdated(row, column);
		return this;
	}
 

happy_robot

Bekanntes Mitglied
das fireTableCellUpdated im renderer führt dazu daß die tabelle permanent neugezeichnet wird....schau mal im taskmanager!
 

Souljumper

Aktives Mitglied
das fireTableCellUpdated im renderer führt dazu daß die tabelle permanent neugezeichnet wird....schau mal im taskmanager!

ja, hab ich auch gemeerkt, aber das Problem bleibt. hab die zeile mittlerweile wieder gelöscht.

wenn ich den text fest setze per setText("bla"); erscheint er in der Tabelle. Wenn ich ihn zur Laufzeit setze funktioniert es nicht.ich versteh es nicht so ganz wo ds Problem liegt.
 

happy_robot

Bekanntes Mitglied
erstmal was anderes :) :

bist du dir bewusst daß die instanz des renderer immer dieselbe ist?

solche dinge wie


this.add(buchLabel);


sollten tabu sein im renderer. die notwendigen elemente sollten nur einmal erzeugt und hinzugefügt werden.

für das einmalige rerendering gibts eine einfache lösung:
erstelle dir eine HashMap<Integer,Object>. im renderer packst du den row-wert und den value wert in die map.
in etwas so:


HashMap<Integer,Object> mapRow;
if(map.get(row,value) == null) {

// RENDERER aufbauen

mapRow.put(row, value);
fireTableChanged......
}

nicht schön aber effektiv. achte auch darauf daß diese map geleert wird wenn das model nicht mehr gebraucht wird.



btw: wie lautet das tag um so etwas als code darzustellen????
 

Souljumper

Aktives Mitglied
ok,

ich versteh was du meinst, das renderobjekt, oder eher das JPanel kann ch zwar problemlos in einer hashtable speichern, allerdings krieg ich ein Problem wenn ich mein gesichertes Panelobjekt dem aktuellen Panel zuweisen will

hier mal mein derzeitiger versuch //das tut es nicht
Java:
			this = imageHashtable.get(row);
this ist in diesem fall eine "extends JPanel implements TableCellRenderer " Klasse

Wie geht die Zuweisung richtig, in der Hashtable speichere ich derzeit das fertige JPanel, wenn ich das jetzt einfach zuweisen könnte wär es super. Geht so aber anscheinend nicht.

edit:
die tags für java code sidn [j*ava][/j*ava] (nur ohne sternchen)
 

Ebenius

Top Contributor
bist du dir bewusst daß die instanz des renderer immer dieselbe ist? [...] this.add(buchLabel); [...] sollten tabu sein im renderer. die notwendigen elemente sollten nur einmal erzeugt und hinzugefügt werden.
Damit hat er Recht. Bitte darüber nachdenken!

ok danke,

ich bin jetzt auf einen andere Trichter gekommen
Sowas nennt man "beratungsresistent". Ich hab Dir einen Quelltext geschrieben. Du sagst danke, machst etwas ganz anderes und gehst nichtmal darauf ein. Warum? :mad:

Bin jetzt fast am Ziel. Mein Problem ist jetzt wieder die Spalte mit dem Bild drin, wenn ich den Text (Titel des Buches) hardkodiert mit setText setze sehe ich den Text in der Spalte neben dem Bild. Versuch ich den Text dynamisch zur Lafuzeit zu setzen sehe ich nichts. Auch das fireTableCellUpdate hilft da nicht.
Schau ein paar Beiträge weiter oben nach der Verknüpfung zum Tutorial, lies es von vorn bis hinten durch! Und dann nochmal. Du bist vom Ziel eigentlich noch recht weit entfernt, weil Du noch nicht verstanden hast, wie CellRenderer funktionieren.
Java:
try {buchLabel.setIcon(new ImageIcon(cover.getBytes(1L, (int) cover.length())));}
Zu teuer in einem Renderer. Das Bild sollte lieber im Model enthalten sein.

Java:
textPane.setFont(new Font("VERDANA",Font.BOLD, 14));
Den Font kann man einmal erstellen. Nicht in der Methode bei jedem Aufruf. Außerdem funktioniert das auf meinem Linux nicht; ich habe keinen Verdana Font. Und nun?

Java:
String s = (String) ((CustomTableModel)table.getModel()).getValueAt(row, column);
Häh? Erstens ist der Cast zu CustomTableModel unnötig; die Methode gehört zu TableModel. Zweitens ist das genau der Wert der schon in Parameter value mitgeliefert wird. Die erneute Abfrage ist also Unsinn. ==> CellRenderer nicht verstanden, oder?

Java:
textPane.setText(s); //funktioniert nicht
Doch. Der Fehler muss woanders liegen. Dieser Teil funktioniert sicher.

Java:
this.add(buchLabel);
Ganz böse. Bei jedem Zeichnen wird die Komponente neu hinzugefügt.

Java:
((CustomTableModel)table.getModel()).fireTableCellUpdated(row, column);
Niemals! Wenn der Renderer Event des Modells verschickt geht nix mehr.

Ebenius
 

Souljumper

Aktives Mitglied
>Sowas nennt man "beratungsresistent". Ich hab Dir einen Quelltext geschrieben. Du sagst danke, machst etwas ganz anderes und gehst nichtmal darauf ein. Warum? :mad:

ich hab den Code schon angesehen, aber Probleme ihn richtig zu interpretieren.


>Schau ein paar Beiträge weiter oben nach der Verknüpfung zum Tutorial, lies es von vorn bis hinten durch! Und dann nochmal. Du bist vom Ziel eigentlich noch recht weit entfernt, weil Du noch nicht verstanden hast, wie CellRenderer funktionieren.

Das Tutorial kenne ich, die erkenntnis das dieses Teil nichts von Haus kann hab ich bereits erlangt :). Das die Routine sehr oft aufgeführt wird wenn der User mit der Maus drin rumklickt ahb ich jetzt auch gemerkt. Ich nähere mich der Verständnis.

>Zu teuer in einem Renderer. Das Bild sollte lieber im Model enthalten sein.

Ja ok, ich hatte bisher das Blob im Modell und dann beim Rendern erst das Image aus dem Blob im Modell gemacht, ich mach das Image jetzt im Modell und hols mirs dann beim rendern


>Den Font kann man einmal erstellen. Nicht in der Methode bei jedem Aufruf. Außerdem funktioniert das auf meinem Linux nicht; ich habe keinen Verdana Font. Und nun?

kA, der Standard-Font sah beim Highlighting unschön auf, die Schriftfart war zu dünn. Kann man irgendwo sehen welche Schriftarten auf Windows, Linux, OS-X gemeinsam verfügbar sind ? (ich nutz OS-X)


>Häh? Erstens ist der Cast zu CustomTableModel unnötig; die Methode gehört zu TableModel. Zweitens ist das genau der Wert der schon in Parameter value mitgeliefert wird. Die erneute Abfrage ist also Unsinn. ==> CellRenderer nicht verstanden, oder?

Ok, das hatte ich verpasst, danke.


>Doch. Der Fehler muss woanders liegen. Dieser Teil funktioniert sicher.
Ecipse zu, Eclipse auf und nochmal ausgeführt dann ging es.....die Ursache dafür kann ich nicht erkennen, ein Swingproblem?


>Ganz böse. Bei jedem Zeichnen wird die Komponente neu hinzugefügt.
Hm ja, unschön. Ich füge die elemente einmal im Konstruktor zum panel hinzu, im renderer selbst setz ich dann nur die Elemente neu.

>Niemals! Wenn der Renderer Event des Modells verschickt geht nix mehr.
Ja, hab ich gemerkt, da macht sich der Renderer selbst Feuer unterm hintern :)

mein Imagerenderer sieht momentan so aus:

Java:
public class ImageRenderer extends JPanel implements TableCellRenderer 
{
	JLabel 		buchLabel; //Label das Component der superKlasse aufnimmt
	JTextArea 	textArea;
	
	ImageRenderer()
	{
		super();
		buchLabel = new JLabel();
		textArea = new JTextArea();
		textArea.setFont(new Font("VERDANA",Font.BOLD, 14));
		this.setLayout(new GridLayout(1,2));
		this.add(buchLabel);
		this.add(textArea);
	}
	
	/**
	 * Ueberscreibt die Rendermethode fuer die Darstellung des Bild-Covers in der ersten Spalte der
	 * Tabelle
	 */
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
		      boolean hasFocus, int row, int column) 
	{

		System.out.println("called");
		setHighlight(isSelected, this, table);
		setHighlight(isSelected, textArea, table);
		
		buchLabel.setIcon(((CustomTableModel)table.getModel()).getImageForPos(row));
		
		textArea.setText((String) (value));
	
		return this;
	}
	
	private void setHighlight(boolean b, Component c, JTable t)
	{
	     if (b) 
	     {
	       c.setForeground(t.getSelectionForeground());
	       c.setBackground(t.getSelectionBackground());
	     }
	     else
	     {
	       c.setForeground(t.getForeground());
	       c.setBackground(t.getBackground());
	     }
	}
	
}

hab nach besten gewissen versucht die tipps zu berücksichtigen, die renderer routine sollte jetzt aufjedenfall performance freundlicher laufen. Ist das so jetzt besser ?
 

André Uhres

Top Contributor
So bekommen wir alle vefügbaren Fontnamen:
GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()
Ansonsten ist der Renderer OK.
 

Souljumper

Aktives Mitglied
ok, danke.

ich kämpfe grade noch mit den LayoutManager mit dem Ziel die Spalte etwas im detail zu verschönern.

aktueller Stand (siehe Anhang)

Jetzt klebt das Bild sehr nah am Rand der JTable und das Textfeld hat auch praktisch keinen Abstand zum Bild - einfach unschön.

Ich würde jetzt gerne ein paar Pixel Abstand jeweils da reinbringen, tu mich da aber sehr schwer. Da das Verhalten der Layoutmanager mir oft dazwischen funkt. (automatische Zuweisung gleich großer Blöcke an jedes Element)

Probiert hab ich jetzt eigentlich schon jeden LayoutManager, wobei mir das BorderLayout dabei noch am ehsten produktive Ergebnisse gebracht hat. GridLayout, GridBagLayout funktionierten gar nicht oder sahen optisch noch schlimmer aus, Spring und Flowlayout waren auch sehr kontraproduktiv.

Hat da jemand eine Idee wie man das noch feintunen könnte?
 

Anhänge

  • b.jpg
    b.jpg
    38,3 KB · Aufrufe: 25
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2
Y JTable AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben