Swing jTable Daten unsichtbar

GianaSisters

Bekanntes Mitglied
Hallo Zusammen,

ich hatte vorgestern schon ein Problem mit dem jTable und habe nun mehrere Beispiele durchgesehen wie es funktionieren könnte. Die folgenden Möglichkeit schien mir am logischsten, aber dennoch gibt es Fehler. Wie unten am Screenshot (vorher->nachher) zu erkennen, werden nach dem Klick des Buttons (mit testBorder() verbunden) die Testwerte "ah" in die richtige Spalte gesetzt. Allerdings unsichtbar und der Rahmen geht nach und nach wenn ich auf das Gitter klicke weg... Ziel ist es natürlich, dass das Gitter sichtbar bleibt und auch die Werte in den Zellen zu sehen sind. Kann Jemand aufgrund des Codes erkennen, was mein Fehler ist ? Bin echt am verzweifeln.
Grüße,
Giana



Java:
private void testBorder(){
        jTable1.setDefaultRenderer(Object.class,new MyTableCellRenderer());
        }

Java:
package fmea;

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class MyTableCellRenderer implements TableCellRenderer {
    public MyTableCellRenderer() {
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus, int row,
                                                   int column) {
       
        if (column == 1) {
        table.setValueAt("ah", row, column);
        }
         return null;
    }
}

sc1.jpg
 

Michael...

Top Contributor
Code:
table.setValueAt(...)
hat in der Rendererer Methode nichts verloren. Bekommst Du da nicht eine Endlosschleife?
Und das
Code:
return null
ist völlig falsch. Mit dieser Methode teilst Du der JTable mit, welche Komponente zum Renderen der Zelle verwendet werden soll. ==> Wenn Du hier null zurückgibst wird die Zelle garnicht gezeichnet.
 

GianaSisters

Bekanntes Mitglied
Hallo Michael,

danke für die Antwort. Ich kriege keine Endlosschleife... Allerdings hab ich mal eine Ausgabe dazwischengebastelt in der die Reihen und Zeilen ausgegeben werden. Da gab es dann etwa 20 mal das selbe - nämlich das alle Zeilen und Spalten runtergerasselt wurden.

Zu dem Return: Es wird eine Componente benötigt (sagt mir das Netbeans). Also was Anderes beim Return kann ich da nicht einsetzen.

Ich glaube das Problem ist, dass ich das Grundprinzip noch nicht verstanden habe. Dabei würde ich so gerne mal ein kleines einfaches Beispiel sehen wir man das handhabt. Das " table.setValueAt("ah", row, column);" funktioniert ja auch im Prinzip...
 

Michael...

Top Contributor
Ein CellRenderer wird von der JTable genutzt, um die Zelle zu zeichnen. Eine Wertübergabe ans Model ist hier völlig fehl am Platz. Dafür ist ja der Editor da.

Hier mal ein KSKB zur Anwendung eines Renderers (hier wird der DefaultTableCellRenderer verwendet, der ein JLabel als Renderingkomponente benutzt)
Gib einfach mal einen Wert in die Tabelle ein und schau Dir an was der Renderer daraus macht.
Java:
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class SimpleRendererDemo extends JFrame {
	public SimpleRendererDemo() {
		JTable table = new JTable(new String[][] {{"Inhalt A"}, {"Inhalt B"}, {"Inhalt C"}, {"Inhalt D"}}, new Object[] {"Titel"});
		table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
				super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
				this.setText("<html>Ich kann anzeigen was ich will, obwohl das Model <b>" + value + "</b> enthält.</html>");
				return this;
			}
		});
		this.add(new JScrollPane(table));
	}
	
	public static void main(String[] args) {
		JFrame frame = new SimpleRendererDemo();
		frame.setBounds(0, 0, 500, 200);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 

GianaSisters

Bekanntes Mitglied
Hallo Michael,

nochmal vielen Dank für die schnelle Hilfe. Ich habe es in meinem Programm durch Deine Hilfe so übernehmen können und nun kann beim getTableCellRendererComponent Feld für Feld angesprochen werden. Mir ist allerdings aufgefallen, dass man per Feldklick später den Inhalt nicht mehr ändern kann wenn er auf diese Art befüllt wurde, wie kann ich später noch den Text des Feldes ändern?
Wird es möglich sein auf diese Weise später einen Rahmen um bestimmte Zellen zu setzen ?


Eine weitere Frage: Kann ich auch machen, dass es nicht erst beim klicken auf den Table kommt, sondern direkt ?

Viele Grüße,
Giana
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Das Füllen mit Inhalt eines Feldes klappt weder mit setText noch mit setValue - mit welcher Methode kann ich denn nun im nachhinein Werte schreiben ?
Wann und durch wen soll denn das Füllen passieren? Dem Anwender wird standardmäßig ein JTextField als Editor zur Verfügung gestellt, wenn der nicht ausreicht (wenn andere Objekte als Strings im Model geändert werden sollen), muss man einen anderen Editor definieren. Sollen Daten durch das "Programm" geändert werden, bietet die JTable bzw. das Model die Methode
Code:
setValueAt(Object value, int row, int column)
mit der gezielt Inhalte des Models geändert werden können. (diese Methode - wie gesagt - nicht im Renderer anwenden)
Wird es möglich sein auf diese Weise später einen Rahmen um bestimmte Zellen zu setzen ?
Mit dem CellRenderer hat man die Möglichkeit das Aussehen jeder einzelnen Zelle (fast) nach belieben anzupassen.
Folgende Renderermethode setzt um die Zellen jeder zweiten Zeile einen roten Rahmen:
Java:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
	super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
	if (row%2==1)
		this.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
	return this;
}
Anmerkung bzgl. des anderen Threads: Das geht nicht zellübergreifend.
 

GianaSisters

Bekanntes Mitglied
Vielen Dank ! Damit kann ich bereits was anfangen.
Bleiben noch 2 Fragen:

1.) Wieso starten diese Methoden erst nachdem ich auf den Table geklickt habe - ich sehe dort keinen ActionListener, würde deshalb damit rechnen, dass der Krams beim Aufruf von
Java:
 jTable1.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
direkt losgeht...


2.) Gibt es bei der Borderfactory auch die Möglichkeit beim Rahmen z.b. die Balken an den beiden Rändern wegzulassen, so dass ich mir dann diesen Felderübergreifenden Rahmen selber basteln kann ?


Edit: createMatteBorder heißt für 2tens das Zauberwort :)

Soweit super vielen Dank und ein schönes Wochenende !
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Die Methode wird von der JTable bzw. deren TableUI verwendet, wenn eine Zelle (neu)gezeichnet werden muss. D.h. letztendlich entscheidet die JTable darüber, wann und ob die Methode für eine konkrete Zelle aufgerufen wird.
 

Stewe

Mitglied
Wenn du in eine Zelle klickts wird nicht der renderer sondern der editor (TableCellEditor) verwendet.
Der renderer wird ausschließlich zum Anzeigen der Daten verwendet.
 

GianaSisters

Bekanntes Mitglied
Vielen Dank,
vermutlich wird beim
SQL:
 public Component getTableCellRendererComponent(JTable jTable1, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
beim Klick auf den Table es gezeichnet. Würde das gerne über einen Button laufen lassen. Welche methode nehm ich dafür dann ?
 

GianaSisters

Bekanntes Mitglied
Vielen dank...

Table1.getModel().setValueAt("wurst", 2, 2);

funktioniert gut... Aber wie ist das mit dem Rahmen, den ich mit
SQL:
  this.setBorder(BorderFactory.createMatteBorder(1, 1, 0, 0, Color.black));
erstelle. Der geht über die getModel - Methoden ja nicht.
 

Michael...

Top Contributor
Letztendlich muss der Renderer anhand der ihm zur Verfügung stehenden Informationen (Zeile, Spalte, Wert im Model) entscheiden können, ob ein Rahmen gezeichnet wird oder nicht.
So was wie: Zeichne eine Border um Zelle XY ist direkt nicht möglich, sondern z.B. nur über eine Anpassung des Wertes im Model.

Hier mal ein etwas älteres Bsp. von mir, mit dem "von aussen" die Hintergrundfarbe einer Zelle aus der zweiten Spalte geändert werden kann. Hoffe die Zusammenhänge werden etwas deutlich, habe leider grad etwas wenig Zeit, sonst hätte ich ein spezifischeres Bsp. geschrieben.
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class ColorTableDemo extends JFrame {
	
	private JTable table;
	private DefaultTableModel model;
	private Color[] bgColor = new Color[] {Color.WHITE, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED};
	
	public ColorTableDemo() {
		model = new DefaultTableModel(new String[] {"Standard", "ColorObjekt"}, 0);
		for (int i=0; i<10; i++)
			model.addRow(new Object[] {"Zeile " + i, new ColorObject("Zeile " + i)});
		table = new JTable(model);
		table.getColumnModel().getColumn(1).setCellRenderer(new ColorRenderer(bgColor));
		this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
		
		JButton button;
		final JComboBox rowCombo, columnCombo, colorCombo;
		
		JPanel panel = new JPanel(new GridLayout(2, 4));
		panel.add(new JLabel("Row:"));
		panel.add(new JLabel("Column:"));
		panel.add(new JLabel("Color:"));
		panel.add(new JPanel());
		panel.add(rowCombo = new JComboBox(new Object[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));
		panel.add(columnCombo = new JComboBox(new Object[] {"Standard", "ColorObject"}));
		panel.add(colorCombo = new JComboBox(bgColor));
		panel.add(button = new JButton("Paint"));
		this.getContentPane().add(panel, BorderLayout.NORTH);
		
		columnCombo.setSelectedIndex(1);
		colorCombo.setSelectedIndex(4);
		
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				Object value = model.getValueAt(rowCombo.getSelectedIndex(), columnCombo.getSelectedIndex());
				if (value instanceof ColorObject) {
					ColorObject co = (ColorObject)value;
					co.setBackground(colorCombo.getSelectedIndex());
					table.repaint();
				}
				else
					JOptionPane.showMessageDialog(ColorTableDemo.this, "Cell cannot change color!\nSelect another one!");
			}
		});
		
		table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				if (!e.getValueIsAdjusting()) {
					rowCombo.setSelectedIndex(table.getSelectedRow());
					columnCombo.setSelectedIndex(table.getSelectedColumn());
				}
			}
		});
	}
	
	class ColorRenderer extends DefaultTableCellRenderer {
		private Color[] colors;
		
		public ColorRenderer(Color[] colors) {
			this.colors = colors;
		}
		
		public Component getTableCellRendererComponent(JTable table, Object value,
                 boolean isSelected, boolean hasFocus, int row, int column) {
			super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
			ColorObject co = (ColorObject)value;
			if(!isSelected && !hasFocus) 
				this.setBackground(colors[co.getBackground()]);
			this.setText(co.getText());
			return this;
		}
	}
	
	class ColorObject {
		private String text;
		private int color;
		
		public ColorObject(String text) {
			this.text = text;
			color = 0;
		}
		
		public String getText() {
			return text;
		}
		
		public void setBackground(int colorIndex) {
			this.color = colorIndex;
		}
		
		public int getBackground() {
			return color;
		}
	}
	
	public static void main(String[] args) {
		JFrame frame = new ColorTableDemo();
		frame.setBounds(0, 0, 800, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
S JTable Daten aus Array AWT, Swing, JavaFX & SWT 9
B Swing JTable mit Daten - Reihen-Größe anpassen AWT, Swing, JavaFX & SWT 0
F Swing JTable: Daten voreinstellen AWT, Swing, JavaFX & SWT 4
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
D Daten von JDialog an JTable in JFrame übergeben AWT, Swing, JavaFX & SWT 7
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
H JTable zeigt keine Daten an AWT, Swing, JavaFX & SWT 5
C Swing JTable Daten einfügen AWT, Swing, JavaFX & SWT 6
Ollek IndexOutOfBoundsException bei neuen Daten in JTable AWT, Swing, JavaFX & SWT 13
J Swing JTable-Daten Speichern und bei zeilen-änderung beibehalten. AWT, Swing, JavaFX & SWT 6
C Daten aus DB -> JTable aktualisieren klappt nicht AWT, Swing, JavaFX & SWT 16
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
Ollek Realisierung: JTable zur Laufzeit mit neuen Daten füllen AWT, Swing, JavaFX & SWT 3
D Problem mit JFileChooser -> Daten werden mit anführungsstriche in JTable geschrieben AWT, Swing, JavaFX & SWT 8
L Swing Daten in JTable aktualisieren AWT, Swing, JavaFX & SWT 5
S Swing Daten aus Datenbank in JTable AWT, Swing, JavaFX & SWT 2
L Daten werden in JTable nicht angezeigt:( AWT, Swing, JavaFX & SWT 6
J Daten in JTable nach Sortierung auslesen AWT, Swing, JavaFX & SWT 2
hdi Swing JTable & Filtern: Daten nicht in der View AWT, Swing, JavaFX & SWT 2
S JTable Bug - eingegebene Daten werden falsch geparst :( AWT, Swing, JavaFX & SWT 4
hdi Swing JTable: Löschen vom Daten im Model AWT, Swing, JavaFX & SWT 7
U JTable mit Daten aus einer HashMap füllen AWT, Swing, JavaFX & SWT 8
R JTable für sehr viele Daten sehr langsam AWT, Swing, JavaFX & SWT 20
B JTable: Wie speichert man manuell eingegebene Daten ausTable AWT, Swing, JavaFX & SWT 2
A JTable Vector mit Daten Ordnen bei setAutoCreateRowS AWT, Swing, JavaFX & SWT 8
S JTable Daten bearbeiten und Grauwertbild erzeugen! AWT, Swing, JavaFX & SWT 4
R Daten in JTable in mehreren Zeilen darstellen AWT, Swing, JavaFX & SWT 11
C JTable fehlende Daten AWT, Swing, JavaFX & SWT 2
raptorrs Daten aus JTable in JTextField übertragen AWT, Swing, JavaFX & SWT 11
G JTable Daten auslesen AWT, Swing, JavaFX & SWT 2
M JTable alte Daten vor Änderung abfangen AWT, Swing, JavaFX & SWT 11
O JTable mit objekt-daten füllen AWT, Swing, JavaFX & SWT 4
M Auslesen veränderter Daten in einer jTable AWT, Swing, JavaFX & SWT 2
J jTable Daten werden nicht sofort sichtbar AWT, Swing, JavaFX & SWT 5
G JTable dynamische Darstellung der ankommenden Daten AWT, Swing, JavaFX & SWT 19
vogella JTable - Hinzufügen von Datensätzen und Ändern von Daten AWT, Swing, JavaFX & SWT 2
D JTable und ungültige Daten AWT, Swing, JavaFX & SWT 2
F JTable Daten aktualisieren AWT, Swing, JavaFX & SWT 2
F JTable Daten übernehmen AWT, Swing, JavaFX & SWT 2
D Daten über Button-Druck in JTable einfügen AWT, Swing, JavaFX & SWT 7
R nur bestimmte Daten in JTable anzeigen lassen? AWT, Swing, JavaFX & SWT 3
L JTable und Daten aus einer ArrayList AWT, Swing, JavaFX & SWT 6
D JTable zum Einfügen/Löschen/Editieren von Daten AWT, Swing, JavaFX & SWT 5
J JTable / Model Daten verändern AWT, Swing, JavaFX & SWT 5
M JTable zeigt daten nicht aktuell an AWT, Swing, JavaFX & SWT 4
C Dynamisches Zuweisen von Daten an eine JTable zur Laufzeit AWT, Swing, JavaFX & SWT 4
L Checkbox in JTable (again), bei true Daten in Header AWT, Swing, JavaFX & SWT 7
G Problem mit JTable / mit dem Eintragen der Daten aus Vector AWT, Swing, JavaFX & SWT 4
R JTable mit Daten aus der Datenbank füllen AWT, Swing, JavaFX & SWT 3
V Daten ins JTable laden bei Start der GUI AWT, Swing, JavaFX & SWT 6
M Daten aus Datenbank ins JTable einfügen AWT, Swing, JavaFX & SWT 4
V Daten im JTable speichern AWT, Swing, JavaFX & SWT 11
G JTable daten auslesen AWT, Swing, JavaFX & SWT 6
M Daten in JTable aus DB schreiben ? AWT, Swing, JavaFX & SWT 16
H Daten aus einer JTable in einer Datei speichern AWT, Swing, JavaFX & SWT 10
D Merken, daß Daten in der JTable sich geändert haben... AWT, Swing, JavaFX & SWT 2
L Daten mittels ObjectInputStream ins JTable AWT, Swing, JavaFX & SWT 7
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
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben