Swing JTable, Zellen-Farbe über Koordinaten ändern

Doc

Aktives Mitglied
Hallo,
hab ein kleines Problem.

Hab eine Tabelle und möchte per Button über Zell-Koordinaten die Hintergrundfarbe dieser Zelle ändern.
Geht das einfach mit einem Befehl ohne den Cell-Renderer zu verändern?

Grüßle,
Doc
 
Versteh das mit dem CellRenderer leider nicht so ganz.

Sollte dieser Befehl nicht funktionieren, oder muss ich im CellRenderer noch was hinzufügen?

table.getCellRenderer(i, 1).setBackground(Color.red);

Ich hab wie gesagt die Koordinaten der Zelle und möchte dann per Button die Zelle einfärben.
 
Zuletzt bearbeitet:
Das hilft auch nicht weiter.
Du musst Dir im Zellobjekt merken, ob die Hintergrundfarbe verändert werden soll und mit einem passenden CellRenderer entsprechend darauf reagieren.
 
Letztendlich gibt es da verschiedene Möglichkeiten aus denen man die für den Zweck passende finden muss.
JTable ist doch eine sehr komplexe Komponente, Es ist empfehlenswert sich dem Thema (inkl. CellRenderer, CellEditor) ersteinmal mittels Lektüre und Beispielen Schritt für Schritt zu nähern.

Grundsätzlich brauchst Du für Dein Vorhaben eine passende Kombination aus Modell und Renderer.

In meinem Bsp. verwende ich ein eigens Definiertes Objekt (ColorObject) und einen Renderer (ColorRenderer) der mit solchen Objekten umgehen kann:
Java:
package demo;

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);
	}
}
 
Vielen, vielen Dank für deine Mühe.

Das ganze scheint ja sehr komplex zu sein.
Gibt es noch eine andere Möglichkeit Zellen oder auch nur ganze Zeilen hervorzuheben?

Wenn eine ganze Zeile markiert wäre, wär das auch in Ordnung. So wie wenn man in die Tabelle klickt. Also irgendwie die Zeilen als selected anwählen.
Allerdings brauche ich die Möglichkeit mehrere Zeilen gleichzeitig hervorzuheben.

Nochmals danke!

EDIT:
habs nun mit table.setRowSelectionInterval und addRowSelectionInterval hinbekommen.
 
Zuletzt bearbeitet:
noch ne Frage 🙂

Wenn ich in einer Zelle eine TextArea habe. Kann ich dann nicht einfach die Hintergrundfarbe der TextArea ändern? Als Highlight sozusagen.
 

Zurück
Oben