Eigener TableCellRenderer - Checkbox wird linksbündig angezeigt?

MarkusG

Mitglied
Hallo alle zusammen,

ich habe mir für meine JTable einen eigenen Renderer geschrieben. Zwei Spalten der Tabelle beinhalten boolsche Werte. Diese stelle ich al Checkbox dar. In meinem Renderer gebe ich bei den entsprechenden Spaltenindexen bei getTableCellRendererComponent(...)
ein Label mit einer Checkbox zurück. Mein Problem hierbei ist, dass ich es nicht schaffe die Checkbox zentriert darzustellen... ich habe bereits alle alignment-Methoden vom JLabel ausprobiert, diverse Layoutmanager verwendet und dabei jedesmal eine linksbündige Ausgabe bekommen. BorderLayout.Center bringt ebenfalls nichts, da unter left keine Komponente steht und somit die ganze Zelle zu Center wird. Dabei steht die Checkbox dann ebenfalls links. Mit einem JPanel und einer Checkbox steht die Checkbox zwar horizontal mittig in der Zelle, allerdings vertikal um ein paar Pixel nach unten versetzt :eek:(

Kann mir in diesem Fall jemand helfen?

Vielen Dank,

mfg. Markus
 
Hallo,

eigentlich brauchst Du für eine CheckBox keinen CellRenderer zu schreiben, es reicht schon, wenn das TableModel für die entsprechende Spalte Boolean.class liefert:
Code:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class TableTest {
    
    public static void main(String[] args) {
        JFrame frame = new JFrame("TableTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        final String[] colNames = {"Column 1", "Column 2"};
        final Object[][] data = new Object[][] {
                {Boolean.FALSE, "value 1"},
                {Boolean.TRUE, "value 2"},
                {Boolean.FALSE, "value 3"}};
        final TableModel model = new DefaultTableModel(data, colNames) {
            public Class getColumnClass(int columnIndex) {
                return (columnIndex == 0) ? Boolean.class : String.class;
            }
        };
        
        JTable table = new JTable(model);
        frame.getContentPane().add(new JScrollPane(table));
        
        frame.setSize(400, 250);
        frame.setVisible(true);
    }

}

Gruß
Vincent
 
Zuletzt bearbeitet:
Hallo,

das hatte ich zuvor so. Allerdings möchte ich in meiner JTable Pflichtfelder (Spalten) farblich hinterlegen. Hierfür habe ich keine andere Möglichkeit gefunden als einen eigenen CellRenderer zu schreiben... und dieser macht bei mir wie oben beschrieben bei den Checkboxen Probleme mit der Zellausrichtung...


Mfg. Markus
 
Hallo,

dann könntest Du versuchen, in Deinem Renderer die CheckBox selbst zurückzugeben, ohne sie erst in einen Container zu packen:
Code:
import java.awt.Color;
import java.awt.Component;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class TableTest2 {
    
    public TableTest2() {
        JFrame frame = new JFrame("TableTest2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        final String[] colNames = {"Column 1", "Column 2"};
        final Object[][] data = new Object[][] {
                {Boolean.FALSE, "value 1"},
                {Boolean.TRUE, "value 2"},
                {Boolean.FALSE, "value 3"}};
        final TableModel model = new DefaultTableModel(data, colNames) {
            public Class getColumnClass(int columnIndex) {
                return (columnIndex == 0) ? Boolean.class : String.class;
            }
        };
        
        JTable table = new JTable(model);
        table.setDefaultRenderer(Boolean.class, new ColoredCellRenderer());
        frame.getContentPane().add(new JScrollPane(table));
        
        frame.setSize(400, 250);
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        new TableTest2();
    }
    
    private class ColoredCellRenderer extends DefaultTableCellRenderer {
        
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            if (value instanceof Boolean) {
                boolean enabled = ((Boolean) value).booleanValue();
                final JCheckBox box = new JCheckBox();
                box.setHorizontalAlignment(SwingConstants.CENTER);
                box.setSelected(enabled);
                
                // die Farben musst Du natürlich von anderen Kriterien abhängig machen
                // hier ist nur ein Beispiel
                if (enabled) {
                    box.setBackground(Color.GREEN);
                } else {
                    box.setBackground(Color.RED);
                }
                return box;
            }
            
            return super.getTableCellRendererComponent(table, 
                    value, isSelected, hasFocus, row, column);
        }
        
    }

}
Gruß
Vincent
 
Super, vielen Dank!

Funktioniert :)

Ich hatte anfangs die CheckBox ohne Container zurückgegeben... allerdings nicht das Alignment auf CheckBox - Ebene gesetzt :mad:

Ich bin davon ausgegangen, dass ich einem Container ein Alignment setzen muss und das der Container dann dafür sorgt, dass seine Komponenten in ihm auf die Mitte zentriert werden...

Mfg. Markus
 

Neue Beiträge

Zurück