DefaultCellRendere - Zellehintergrundsfarbe anpassen

Hallo an alle,

Ich bin neu hier in diesem Forum, möchte aber gleich ohne groß rumschwafeln zu meinem Problem kommen.

Mein Problem:
Ich kann die Zellhintergrundfarbe einer selektierten Zelle in meiner JTable nicht durch einen Mausklick anpassen.

Meine Situation:
Ich versuche unter Java das Programm "Schiffe versenken" zu programmieren - Ist die Abschlussnote für meinen Programmierkurs.
Für das Feld, auf dem man die einzelnen Schiffe positionieren kann, habe ich mich für eine JTable entschieden.
Nach einer ausgedehnten Researche bin ich dann auf folgenden Link gekommen in eurem Forum:
http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/7032-jtable-teil-4-darstellung-daten.html
Gibt einen guten Einblick in das Thema. Ich habe versucht mich an die Anleitung zuhalten, jedoch funkt es bei mir noch immer nicht. ???:L

Zur besseren Übersicht mein Code der JTable:
Java:
table = new JTable(rowData, columnName);
		table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null, null, null, "", null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
			},
			new String[] {
				"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"
			}
		) {
			boolean[] columnEditables = new boolean[] {
				false, false, false, false, false, false, false, false, false, false
			};
			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		table.getColumnModel().getColumn(0).setResizable(false);
		table.getColumnModel().getColumn(0).setPreferredWidth(50);
		table.getColumnModel().getColumn(1).setResizable(false);
		table.getColumnModel().getColumn(1).setPreferredWidth(50);
		table.getColumnModel().getColumn(2).setResizable(false);
		table.getColumnModel().getColumn(2).setPreferredWidth(50);
		table.getColumnModel().getColumn(3).setResizable(false);
		table.getColumnModel().getColumn(3).setPreferredWidth(50);
		table.getColumnModel().getColumn(4).setResizable(false);
		table.getColumnModel().getColumn(4).setPreferredWidth(50);
		table.getColumnModel().getColumn(5).setResizable(false);
		table.getColumnModel().getColumn(5).setPreferredWidth(50);
		table.getColumnModel().getColumn(6).setResizable(false);
		table.getColumnModel().getColumn(6).setPreferredWidth(50);
		table.getColumnModel().getColumn(7).setResizable(false);
		table.getColumnModel().getColumn(7).setPreferredWidth(50);
		table.getColumnModel().getColumn(8).setResizable(false);
		table.getColumnModel().getColumn(8).setPreferredWidth(50);
		table.getColumnModel().getColumn(9).setResizable(false);
		table.getColumnModel().getColumn(9).setPreferredWidth(50);
		table.setRowHeight(20);
		table.setBackground(SystemColor.desktop);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION ); 
		table.setColumnSelectionAllowed(false);
		table.setRowSelectionAllowed(false);
		table.setCellSelectionEnabled(true);
		table.setBounds(68, 125, 223, 200);
		
		table.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent arg0) {
				int x = table.getSelectedColumn();				
				int y = table.getSelectedRow();		
				
				[code] table.setDefaultRenderer( Color.class, new MyTableCellRenderer() );

System.out.println(x +" "+ y);
}
});
[/code]

Mein Code des DefaultCellRenderer
Java:
public class MyTableCellRenderer extends 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);

		Color color = (Color) value;

		setText(color.getRed() + ", " + color.getBlue() + ", "
				+ color.getGreen());
		setForeground(color);
		setBackground(Color.green);

		return this;
	}

}

Ich weiß, dass das Thema schon einmal gepostet wurde. Ich würde aber euch bitten ein kurzen Blick darauf zu werfen, denn ich finde meinen Fehler nicht, den ich gemacht habe.
Gemäße dem Sprichwort:"Man sieht den Wald, vor lauter Bäume nicht" :autsch:

Vielen Dank für eure Hilfe.

LG

Adriano-Celentano
 

Michael...

Top Contributor
Da das ganze für eine Abschlussarbeit ist ein paar Hinweise:
Java:
table = new JTable(rowData, columnName);
		table.setModel(new DefaultTableModel(...
Die Übergabe von rowData und columnName in der obersten Zeile ist überflüssig, wenn Du eine Zeile später sowieso ein neues TableModel setzt. (wenn nicht sogar gefährlich, wenn man im späteren Ablauf versucht über diese Arrays das Datenmodel zu manipulieren)
Java:
		table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null, null, null, "", null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
			},
			new String[] {
				"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"
			}
würde man diesen Konstruktor verwenden könnte man sich einige Zeilen Code sparen:
Code:
DefaultTableModel(Object[] columnNames, int rowCount)
Java:
		table.getColumnModel().getColumn(0).setResizable(false);
		table.getColumnModel().getColumn(0).setPreferredWidth(50);
		table.getColumnModel().getColumn(1).setResizable(false);
		table.getColumnModel().getColumn(1).setPreferredWidth(50);
		table.getColumnModel().getColumn(2).setResizable(false);
		table.getColumnModel().getColumn(2).setPreferredWidth(50);
		table.getColumnModel().getColumn(3).setResizable(false);
		table.getColumnModel().getColumn(3).setPreferredWidth(50);
		table.getColumnModel().getColumn(4).setResizable(false);
		table.getColumnModel().getColumn(4).setPreferredWidth(50);
		table.getColumnModel().getColumn(5).setResizable(false);
		table.getColumnModel().getColumn(5).setPreferredWidth(50);
		table.getColumnModel().getColumn(6).setResizable(false);
		table.getColumnModel().getColumn(6).setPreferredWidth(50);
		table.getColumnModel().getColumn(7).setResizable(false);
		table.getColumnModel().getColumn(7).setPreferredWidth(50);
		table.getColumnModel().getColumn(8).setResizable(false);
		table.getColumnModel().getColumn(8).setPreferredWidth(50);
		table.getColumnModel().getColumn(9).setResizable(false);
		table.getColumnModel().getColumn(9).setPreferredWidth(50);
Schleifen sind vermutlich auch schon mal durch genommen worden??

Zu Deinem Problem:
Java:
		table.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent arg0) {
				int x = table.getSelectedColumn();				
				int y = table.getSelectedRow();		
				
				[code] table.setDefaultRenderer( Color.class, new MyTableCellRenderer() );

System.out.println(x +" "+ y);
}
});[/code]
So funktioniert das nicht, den CellRenderer setzt man einmalig bei der Initialisierung der JTable. Beim Klicken auf der JTable ändert man der Inhalt (bzw. den des Models). Der CellRenderer kann dann anhand des Inhalts einer Zelle "entscheiden" wie der diese darstellt. ==> noch mal einen Blick ins Tutorial werfen.
 
Hallo Michael...

Danke für deine schnelle Antwort. Du hast mich schon ein Stück weiter gebracht.
Punkt 1. habe ich angepasst.
Punkt 2. noch nicht angepasst. Diesen Quellcode hat mir WindowsPro Builder automatisch generiert.
Punkt 3. habe ich angepasst.
Punkt 4. habe ich soweit angepasst wie es im Tutorial steht. Ich habe das übersehen, dass man nur einmalig den DefaultTableCellRenderer initialisieren muss.

Eine Frage habe ich da noch: Wie schaffe ich es, dass die selektierten Zellen, die Farbe danach bei behalten?

Java:
table = new JTable();
		table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
				{null, null, null, null, null, null, null, null, null, null},
			},
			new String[] {
				"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"
			}
		) {
			boolean[] columnEditables = new boolean[] {
				false, false, false, false, false, false, false, false, false, false
			};
			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		for (int i = 0; i <= 9; i++) {
			table.getColumnModel().getColumn(i).setResizable(false);
			table.getColumnModel().getColumn(i).setPreferredWidth(50);
			
		}
		
		table.setRowHeight(20);
		table.setBackground(SystemColor.desktop);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

		table.setColumnSelectionAllowed(true);
		table.setRowSelectionAllowed(true);
		table.setCellSelectionEnabled(true);
		table.setBounds(68, 125, 223, 200);

		table.setDefaultRenderer(Object.class, new MyTableCellRenderer2());
[/Java]

Der DefaultTableCellRenderer
[code=Java]
public class MyTableCellRenderer2 extends DefaultTableCellRenderer {
	private Color colorSelected = Color.green;
	private Color colorFocus = Color.red;
	private Color colorNormal = Color.blue;

	public MyTableCellRenderer2(){
        setOpaque( true );
    }
	
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		System.out.println("-----------------------------------------------");
		setForeground(Color.BLACK);

		if (hasFocus) {
			setBackground(colorFocus);
		} else if (isSelected) {
			setBackground(colorSelected);
		} else {
			setBackground(colorNormal);
		}

		setValue(value);
		return this;
	}
}

Und danke nochmals für deine Unterstützung.

LG

Adriano-Celentano
 

bERt0r

Top Contributor
Für ein Schiffeversenken Spiel würdest du dir mit einem Panel auf dem ein GridLayout liegt glaube ich leichter tun.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
Yonnig JavaFX Größe von WebView an Content anpassen AWT, Swing, JavaFX & SWT 3
W JavaFX Farben dynamisch anpassen AWT, Swing, JavaFX & SWT 4
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
K JavaFX Component Größe an Inhalt anpassen AWT, Swing, JavaFX & SWT 11
L JavaFX Pane inklusive Inhalt der Bildschirm Auflösung anpassen AWT, Swing, JavaFX & SWT 13
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
W JavaFX Tabelle zeilenweise mit Werten füllen und an Container anpassen AWT, Swing, JavaFX & SWT 23
R Größe von Scene und stage an grid anpassen AWT, Swing, JavaFX & SWT 4
M Java FX größe der shapes anpassen AWT, Swing, JavaFX & SWT 0
R Swing JCTable auf Java9 anpassen AWT, Swing, JavaFX & SWT 10
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
K Swing labels anpassen AWT, Swing, JavaFX & SWT 1
J Gridpane Breite in Scrollpane automatisch anpassen AWT, Swing, JavaFX & SWT 2
M Swing GUI an Auflösung und Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 11
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
L JavaFX ListView Größe anpassen AWT, Swing, JavaFX & SWT 1
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
I CSS - backgroundImage - Größe automatisch an den Container anpassen AWT, Swing, JavaFX & SWT 1
P TreeView automatisch an große von Inhalt anpassen AWT, Swing, JavaFX & SWT 3
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
Y Listview Textfield vergrößern, Schrift anpassen AWT, Swing, JavaFX & SWT 0
I JFrame an Bildschirm anpassen AWT, Swing, JavaFX & SWT 1
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20
G JavaFX Width von Nodes einer HBox an Tab width anpassen AWT, Swing, JavaFX & SWT 3
M Swing JColorchooser anpassen - custom style? AWT, Swing, JavaFX & SWT 0
F Swing Anpassen des Layouts AWT, Swing, JavaFX & SWT 3
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
B Swing JTable mit Daten - Reihen-Größe anpassen AWT, Swing, JavaFX & SWT 0
M Swing TableCellRenderer elegant anpassen AWT, Swing, JavaFX & SWT 3
D JFileChooser anpassen AWT, Swing, JavaFX & SWT 5
S JMenuBar wiederverwenden und Eventhandling anpassen AWT, Swing, JavaFX & SWT 4
A Swing Logikaufgabe: Zeilenanzahl einer JTable mit 3d String dynamisch anpassen AWT, Swing, JavaFX & SWT 2
M Swing JTabbedPane: Tab-Elemente anpassen AWT, Swing, JavaFX & SWT 3
I JTable Spalten automatisch dem Inhalt anpassen! AWT, Swing, JavaFX & SWT 6
D Swing Spielfeldgroesse anpassen AWT, Swing, JavaFX & SWT 5
N Swing microba - DatePicker: Feld-Hintergrund anpassen AWT, Swing, JavaFX & SWT 2
S Swing Feldgrösse anpassen ? AWT, Swing, JavaFX & SWT 3
K JSpinner in passender Breite erstellen oder automatisch anpassen AWT, Swing, JavaFX & SWT 2
B JTextArea Größe an Container anpassen AWT, Swing, JavaFX & SWT 2
windl GUI an Bildschirmauflösung anpassen AWT, Swing, JavaFX & SWT 7
A Swing Anpassen der Spaltenbreite durch die länge eines Strings AWT, Swing, JavaFX & SWT 3
D JTable width automatisch anpassen AWT, Swing, JavaFX & SWT 4
N Swing KomponentenHöhe an html-Inhalt anpassen AWT, Swing, JavaFX & SWT 4
windl Querstreifen beim Bilder malen und anpassen an neue CPU AWT, Swing, JavaFX & SWT 12
C Scollpane an dynamisches GridLayout anpassen? AWT, Swing, JavaFX & SWT 3
G Swing JComboBox anpassen AWT, Swing, JavaFX & SWT 6
W Bildgröße automatisch an Komponenten anpassen AWT, Swing, JavaFX & SWT 3
M Fenstergrösse an Bild anpassen AWT, Swing, JavaFX & SWT 13
T Die Größe einer JTextArea an Ihren Parent JPanel anpassen. AWT, Swing, JavaFX & SWT 5
T Spaltennamen jeweils der angezeigten Tabelle anpassen AWT, Swing, JavaFX & SWT 19
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
R JTable: Spaltenbreite automatisch anpassen AWT, Swing, JavaFX & SWT 3
B JSpinner Textgröße anpassen AWT, Swing, JavaFX & SWT 2
P Swing JScrollPane-Inhalt: Grösse anpassen AWT, Swing, JavaFX & SWT 6
B FileChooser anpassen AWT, Swing, JavaFX & SWT 2
0 JPanel nicht an größe des JFrames anpassen AWT, Swing, JavaFX & SWT 3
B Tabelle anpassen AWT, Swing, JavaFX & SWT 6
L JFrame an Paint-Inhalt anpassen AWT, Swing, JavaFX & SWT 6
B JScrollpane - Größe anpassen AWT, Swing, JavaFX & SWT 4
X JEditorPane Größe in JDialog automatisch anpassen AWT, Swing, JavaFX & SWT 2
M JPanel an JFrame anpassen AWT, Swing, JavaFX & SWT 7
J Button Layout anpassen AWT, Swing, JavaFX & SWT 22
X jTable anpassen AWT, Swing, JavaFX & SWT 2
S Swing Panelgröße anpassen wenn Frame maximiert wird AWT, Swing, JavaFX & SWT 2
I Swing Optik eines JButton an JToolBar anpassen AWT, Swing, JavaFX & SWT 5
T Swing jTextArea soll sich der Fenstergröße anpassen beim ziehen?? AWT, Swing, JavaFX & SWT 2
Mike90 JTabbedPane Größe anpassen AWT, Swing, JavaFX & SWT 17
T LayoutManager GridBagLayout an Fenstergröße anpassen AWT, Swing, JavaFX & SWT 2
N JTable Zellenhöhe an Zeilenanzahl anpassen AWT, Swing, JavaFX & SWT 3
W Zellengröße in Jtable anpassen AWT, Swing, JavaFX & SWT 3
S Swing Inhalt eines Fenster bei Größenänderung anpassen (GroupLayout) AWT, Swing, JavaFX & SWT 2
F Swing Höhe eines Headers einer JTable anpassen AWT, Swing, JavaFX & SWT 4
M JCheckBox Icon anpassen AWT, Swing, JavaFX & SWT 2
G Swing Komponenten dem Hintergrundbild des JPanels anpassen? AWT, Swing, JavaFX & SWT 6
T Swing Dialoginhalt automatisch anpassen während Größenänderung AWT, Swing, JavaFX & SWT 2
M Swing JTextArea größe anpassen & setBackground liefer Nullpointer AWT, Swing, JavaFX & SWT 4
W JTabbedPane Größe anpassen AWT, Swing, JavaFX & SWT 4
N JFrame mit Elementen an die Bildschirmgröße automatisch anpassen AWT, Swing, JavaFX & SWT 3
W Swing JScrollpane Scroller/Pfeile anpassen AWT, Swing, JavaFX & SWT 7
S ImageIcon Grösse anpassen AWT, Swing, JavaFX & SWT 2
M Swing JTable anpassen AWT, Swing, JavaFX & SWT 6
K JFrame-Größe an inneren Container anpassen AWT, Swing, JavaFX & SWT 2
M Image an Gridlayout anpassen AWT, Swing, JavaFX & SWT 5
D Aussehen von GUI-Komponenten ans Betriebssystem anpassen AWT, Swing, JavaFX & SWT 3
K Look&Feel von JMenuBar und Subkomponenten anpassen AWT, Swing, JavaFX & SWT 6
T JTree mit Checkboxen anpassen AWT, Swing, JavaFX & SWT 7
hdi Swing JTable: Selektion beim Umsortieren anpassen AWT, Swing, JavaFX & SWT 7
E Eine Seite eines Frames variabel anpassen lassen? AWT, Swing, JavaFX & SWT 10
H Schriftgröße automatisch an JLabel anpassen AWT, Swing, JavaFX & SWT 6
M Größe von JTextPane manuell bei Bedarf anpassen AWT, Swing, JavaFX & SWT 6
M Scrollbar anpassen (Position) AWT, Swing, JavaFX & SWT 6
K JButton anpassen AWT, Swing, JavaFX & SWT 2
E GridBagLayout Zellengröße anpassen AWT, Swing, JavaFX & SWT 6
M Anpassen der Größe eines JPanels (incl. gezeichneter Ampel) AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben