JTable - Zellenfarbe zur Laufzeit ändern?

freek0815

Grünschnabel
Hey Leute,

ich brauch mal wieder ein paar Fachmänner. Ich möchte ein Tabelle basteln, bei der man zum Beispiel durch Knopfdruck die Hintergrundfarbe in Zelle(x,y) zur Laufzeit ändern kann. Ich hab irgendwie soviel mitbekommen, dass man sich einen CellRenderer basteln muss. Ich hab aber irgendwie die Beispiele im Netz nicht richtig verstanden. Könnt ihr mir vielleicht ein gutes Beispiel geben. (Achso: Es muss möglich sein weitere Zeilen zur Laufzeit an die Tabelle anzuhängen)

Erstmal vielen Dank für eure Bemühungen
 
Moin!
Man sage mir , wenn ich mich irre, aber

Code:
DefaultCellRenderer rend = (DefaultCellRenderer)yourTable.getCellRenderer(row,column) ;
 rend.setBackground(new Color());
repaint();
sollte es doch tun, oder?

*grüssle*
MeinerEiner
 
Das hab ich auch schon mal gesehen. Funktioniert bei mir aber irgendwie nicht. Da wird bei mir die Komplette Hintergrundfarbe der Tabelle geändert. Was mach ich da falsch?
 
Also ich glaube dass muss auch DefaultTableCellRenderer heißen, sonst gibts irgendwie Probleme.

Code:
DefaultTableCellRenderer rend = (DefaultTableCellRenderer)myTable.getCellRenderer(row,column) ;
rend.setBackground(Color.GRAY);
repaint();

Aber mit diesem Code geht es trotzdem nicht. :(
 
Nun, wenn das nicht klappt, kommen wir wohl um eine eigene Implementierung des TableCellRenderes nicht herum:

TestFrame
Code:
public class TestFrame implements ActionListener {
    public static boolean pressedButton = false;
    
    public void start(){
        JFrame frame = new JFrame();
        frame.setSize(300,300);
        String[][] data = {{"12","123"},{"121","123"},{"121","122"},{"122","121"}};
        String[] cols = {"nr1","nr2"};
        JTable table = new JTable(data, cols);
        TableCellRenderer renderer = new CustomCellRenderer();
        table.setDefaultRenderer(Object.class, renderer );
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(table);
        frame.getContentPane().add(getButton());
        frame.setVisible(true);
        
    }
    public JButton getButton(){
        JButton button = new JButton("press me");
        button.addActionListener(this);
        return button;
        
    }
    public void actionPerformed(ActionEvent e) {
        if(pressedButton) pressedButton = false;
        else pressedButton = true;
        
    }

}
CustomCellRenderer
Code:
public class CustomCellRenderer extends DefaultTableCellRenderer{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column){
            Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if((hasFocus) && (TestFrame.pressedButton)){
                cell.setBackground( Color.gray );    
            }
            else
            {
                cell.setBackground( Color.white );
            }
            return cell;

    }
}
Ich denke mal, das sollte dir helfen... den CustomCellRenderer musst du dann noch natürlich deinen Wünschen anpassen. Ebenso würde ich ein eigenes TableModel empfehlen, statt der initialisierung mit String arrays.

*grüssle*
MeinerEiner
 
Zurück