tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
8573
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MarkusG MarkusG ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    32
    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 :o(

    Kann mir in diesem Fall jemand helfen?

    Vielen Dank,

    mfg. Markus
     

  2. #2
    Avatar von Vincentius
    Vincentius Vincentius ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Stuttgart
    Beiträge
    295
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    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
    Geändert von Vincentius (08.12.04 um 10:03 Uhr)
     

  3. #3
    MarkusG MarkusG ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    32
    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
     

  4. #4
    Avatar von Vincentius
    Vincentius Vincentius ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Stuttgart
    Beiträge
    295
    Hallo,

    dann könntest Du versuchen, in Deinem Renderer die CheckBox selbst zurückzugeben, ohne sie erst in einen Container zu packen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    
    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
     

  5. #5
    MarkusG MarkusG ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    32
    Super, vielen Dank!

    Funktioniert

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

    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
     

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 07.07.10, 16:14
  2. Eigener Blog: Kommentare werden mehrfach angezeigt
    Von Eingeweidemann im Forum PHP
    Antworten: 7
    Letzter Beitrag: 07.06.10, 20:22
  3. Eigener Markenname wird gesucht
    Von srkn61 im Forum Gründung & Gewerbe
    Antworten: 9
    Letzter Beitrag: 29.10.09, 20:40
  4. Eigener ListCellRenderer - Einträge werden nicht als selektiert angezeigt
    Von mki_germo im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 01.09.09, 14:40
  5. Checkbox nach Neuladen angezeigt lassen
    Von mkoeni1 im Forum Javascript & Ajax
    Antworten: 6
    Letzter Beitrag: 20.12.07, 14:13