tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
926
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Marc79 Marc79 ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    69
    Hi zusammen,

    ich möchte in einer Tabelle in einer Spalte eine Checkbox anzeigen, welche dementsprechend einen Haken (true or false) anzeigt.

    Ich verwende ein DefaultTableModel.
    Hier ertselle ich meine Spaltennamen.

    An einer anderen Stelle setze ich zwei Werte in zwei Spalten

    Code :
    1
    
    copyPathModel.insertRow(copyPathModel.getRowCount(), new Object[]{true, fc.getSelectedFile().getAbsolutePath()});

    in der Spalten steht dann z. B. true und c:\irgendwas
    Wie bekomme ich es hin, dass eine Checkbox sichtbar wird.

    Ich habe jetzt einige Tutorials gelesen, aber entweder sie funktionieren nicht oder werden von Leuten als "zu komplitziert" eingestuft.

    Was ist die einfachste Methode so eine CheckBox in einer Tabelle darzustellen?

    Vielen Dank und Gruß
    Marc
     

  2. #2
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    Im TableModel gibt es die Methode getColumnClass. Diese musst du überschreiben und für die Spalte in der die checkbox angezeigt werden soll, gibst du Boolean.class zurück. Für den Rest gibst du einfach das vom super-Aufruf zurück.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  3. #3
    Marc79 Marc79 ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    69
    Hi Sascha,

    etwa so?

    Code :
    1
    
    copyPathTable.getColumnModel().getColumn(0).setCellRenderer(copyPathTable.getDefaultRenderer(Boolean.class));

    ich versuche nur deinen Tipp zu verstehen. Wenn ich das wie hier aufgeführt umsetze sehe ich immer noch keine CheckBox
     

  4. #4
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Nee, nicht ganz.
    Ganz grob gesagt hat die JTable eine HashMap mit Renderern. Als Key ist dort ein Class-Object und als Value ein Renderer. Dort sind schon einige Renderer eingestellt (bspw für Integer und Boolean).
    Wenn die Tabelle gezeichnet wird, lässt sie sich vom Model das Value geben, welches in der Zelle (z.b. Zelle 0,0) dargestellt werden soll. Zusätzlich fragt die Tabelle das Model um welchen Datentyp es sich in dieser Spalte (bsp Spalte 0) handelt. Dann hat die Tabelle das Value und die Klasse für diese Zelle.
    Jetzt kann von dieser HashMap der passende Renderer geholt werden.

    Standardmäßig ist die Klasse für jede Spalte auf Object.class gesetzt. Das kann man aber ändern.
    Schau mal hier

    Code java:
    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
    
     
    package tutorialsde;
     
    import java.awt.BorderLayout;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import quicktime.std.image.GECompressorInfo;
     
    /**
     *
     * @author sash
     */
    public class Main {
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            JTable table = new JTable();
            PersonModel model = new PersonModel(createPersonList());
     
            table.setModel(model);
     
            frame.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
     
            frame.pack();
            frame.setVisible(true);
        }
     
        private static List<Person> createPersonList() {
            List<Person> list = new ArrayList<Person>();
     
            list.add(new Person("Müller", "Horst", true));
            list.add(new Person("Meier", "Inge", false));
            return list;
        }
     
    }

    Code java:
    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
    
     
    package tutorialsde;
     
    import java.util.List;
    import javax.swing.table.AbstractTableModel;
     
    /**
     *
     * @author sash
     */
    public class PersonModel extends AbstractTableModel{
     
        private static final String[] HEADER = {"Name", "Vorname", "Männlich"};
        private List<Person> data;
     
        public PersonModel(List<Person> data) {
            this.data = data;
        }
     
     
     
        public int getRowCount() {
            return data.size();
        }
     
        public int getColumnCount() {
            return HEADER.length;
        }
     
        public Object getValueAt(int row, int column) {
            Person person = data.get(row);
     
            switch(column){
                case 0: return person.getName();
                case 1: return person.getVorname();
                case 2: return person.isMale();
                default: return "";
            }
        }
     
        @Override
        public String getColumnName(int column) {
            return HEADER[column];
        }
     
    // Hier kann man die Klasse für eine Spalte ändern. 
        @Override
        public Class<?> getColumnClass(int column) {
            if(column == 2){
                return Boolean.class;
            }
            return super.getColumnClass(column);
        }
     
     
    }
    Code java:
    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
    70
    71
    72
    73
    74
    
     
     
    package tutorialsde;
     
    /**
     *
     * @author sash
     */
    public class Person {
     
        private String name;
        private String vorname;
     
        private boolean isMale;
     
        public Person() {
            this("","",true);
        }
     
     
     
        public Person(String name, String vorname, boolean isMale) {
            this.name = name;
            this.vorname = vorname;
            this.isMale = isMale;
        }
     
     
     
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
     
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
     
        /**
         * @return the vorname
         */
        public String getVorname() {
            return vorname;
        }
     
        /**
         * @param vorname the vorname to set
         */
        public void setVorname(String vorname) {
            this.vorname = vorname;
        }
     
        /**
         * @return the isMale
         */
        public boolean isMale() {
            return isMale;
        }
     
        /**
         * @param isMale the isMale to set
         */
        public void setIsMale(boolean isMale) {
            this.isMale = isMale;
        }
     
     
     
    }

    Ich hoffe das hilft.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  5. #5
    Marc79 Marc79 ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    69
    Hi Sascha,

    habe gerade parallel folgendes probiert:

    Code :
    1
    2
    
    copyPathModel.insertRow(copyPathModel.getRowCount(), new Object[]{true, fc.getSelectedFile().getAbsolutePath()});
          copyPathTable.getColumnModel().getColumn(0).setCellRenderer(copyPathTable.getDefaultRenderer(Boolean.class));

    wenn ich das Rendering direkt nach dem Insert mache wird die CheckBox gezeichnet

    Bei meiner Lösung ist die Tabelle am Anfang immer Leer und wird erst zur Laufzeit durch den User gefüllt.

    Habe leider mit Rendering noch nie etwas gemacht ... unter C# z.B. ist es ganz einfach möglich solche Controls in eine ListView zu implementieren.

    Bei Java brauche ich da wohl noch Übung, aber ich versuche immer so wenig wie möglich zu ändern oder zu überschreiben.

    Danke für dein Beispiel, das hilft mir beim Verstehen!

    Gruß Marc
     

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 02.05.06, 00:34
  2. JTable mit verschiedenen Comboboxen in einer Spalte?
    Von Karl22 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 27.04.06, 08:28
  3. Antworten: 4
    Letzter Beitrag: 04.08.05, 21:18
  4. JTable mit mehreren Componenten in einer Spalte ?
    Von vrcat im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 27.08.04, 14:05
  5. JTable: mehrere Werte in einer Spalte
    Von Crazy Bytes im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 7
    Letzter Beitrag: 10.05.04, 13:17

Stichworte