gibt es eine Möglichkeit die Schrift oder den Grid oder
den Hintergrund einer einzelnen Zeile zu verändern ?
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setBackground(Color.red);
table.setDefaultRenderer();
Diese Zeilen setzten ja gleich die Farbe der ganzen Tabelle,
da sich die Tabelle nur einen TableCellRenderer für alle
Zellen benutzt.
Auf Spalten kann man ja auch einzeln zugreifen und
den CellRenderer setzen. Aber wie geht das für
Zeilen oder einzelne Zellen ?
Muß ich dazu wirklich die Klasse javax.swing.plaf.basic.BasicTableUI
überschreiben ?
Dort gibt es ein private Methode drawRow(Graphics g,int row).
Gruß
Frank
Ich denke mal, Du mußt TableRenderer erweitern, so daß Du die Methode
getTableCellRendererComponent(JTable table, Object value, boolean
isSelected, boolean hasFocus, int row, int column) überschreibst. Darin
fragst Du einfach ab, in welcher Zeile Du gerade bist und färbst die
Componente so, wie Du es gerade willst, also meinetwegen bei geraden rot und
bei ungeraden blau.
Gruß,
Jörn
Ja, aber ich will ja die prinzipielle Funktionalität aller
vorhandener Renderer beibehalten und nur die BackgroundColor setzen.
Gruß Frank
Wenn ich die Methode prepareRenderer(... ) der JTable
wie unten überschreibe geht es. Allerdings gefällt mit
die Sache mit dem copieren der Componenten gar nicht.
Wenn ich das nicht mache, dann werden sofort alle
Zellen rot.
Allerdings finde ich das Kopieren der Komponeten sehr unschön.
Das muß doch anders zu lösen sein ?
public Component prepareRenderer(TableCellRenderer renderer, int row,
int column) {
Component component = super.prepareRenderer(renderer, row, column);
if (row == 1){
// Tools.copy makes a deep copy of the component
Component coloredComponent = (Component)Tools.copy(component);
coloredComponent.setBackground(Color.red);
return coloredComponent;
} else {
return component;
}
}
//############## die ganze Klasse ################
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
//import de.benke.ipos.modtool.util.*;
import java.io.*;
public class ColoredTable extends JTable{
public ColoredTable (Object[][] data, Object[] column){
super(data, column);
}
public Component prepareRenderer(TableCellRenderer renderer, int row,
int column) {
Component component = super.prepareRenderer(renderer, row, column);
if (row == 1){
//if (column == 1){
Component coloredComponent =
(Component)ColoredTable.copy(component);
coloredComponent.setBackground(Color.red);
return coloredComponent;
} else {
return component;
}
}
/**Returns a deep copy of the argument.
* The argument Object has to implement the serialisible interface.
*/
public static Object copy(Object o) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream objectOut = new ObjectOutputStream(out);
objectOut.writeObject(o);
ByteArrayInputStream in = new
ByteArrayInputStream(out.toByteArray());
ObjectInputStream objectIn = new ObjectInputStream(in);
return (objectIn.readObject());
} catch (Exception e) {
return null;
}
}
public static void main(String[] args) {
String[] col= {"Number", "English", "Deutsch", "Espanol"};
String[][] data = {{"1" , "one" , "eins" , "uno" },
{"2" , "two" , "zwei" , "dos" },
{"3" , "three" , "drei" , "tress" },
{"4" , "four" , "vier" , "quatro" },
{"5" , "five" , "fünf" , "cinco" }};
//----------------- start main() ----------------------
try {
System.out.println("Main method of class GroupableTable called");
ColoredTable mainTable = new ColoredTable(data, col);
JFrame frame = new JFrame("Test Window of Class GroupableTable");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Container c = frame.getContentPane();
c.add(new JScrollPane(mainTable), BorderLayout.CENTER);
// Set the size of the JFrame and show it
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
final int indent = 20;
frame.setBounds( indent, indent, screenSize.width - indent*2,
screenSize.height - indent*2 );
//frame.pack();
frame.setVisible(true);
}
catch(Exception x)
{
x.printStackTrace();
}
}
}
Frank Zapf schrieb:
>
> Außerdem benutzt die Tabelle irgendwie immer die gleichen Renderer.
Das stimmt nicht, man muß nur immer die Farbe setzte:
public Component prepareRenderer(TableCellRenderer renderer, int row,
int column) {
Component component = super.prepareRenderer(renderer, row, column);
if (row == 1){
component.setBackground(Color.red);
} else {
component.setBackground(this.getBackground());
}
return component;
}
Über: boolean isSelected = isCellSelected(row, column);
und Color tableSelectionBackground = this.getSelectionBackground();
kann man dann auch noch die Zustände bei isSelected abfangen.
Gruß Frank