JTable und CheckBoxen in einer Spalte

Marc79

Mitglied
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:
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
 
JTable und CheckBoxen in einer Spal ...

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
 
Hi Sascha,

etwa so?

Code:
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 :-(
 
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

Java:
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;
    }

}

Java:
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);
    }


}
Java:
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
 
Hi Sascha,

habe gerade parallel folgendes probiert:

Code:
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
 

Neue Beiträge

Zurück