# JCheckBox in JTable



## Verjigorm (9. Jan 2009)

Hallo,
irgendwie funktionieren meine Checkboxen in der JTable nicht so wie ich möchte.
Der Text wird nicht immer angezegt und selektiert werden sie auch nicht korrekt.
Kann mir wer sagen, was man da ändern muss, irgendwie raff ich das nicht so ganz.
Die Renderer und Editoren sind immer noch ein Rätsel für mich.

mfg Verjigorm 


```
package jtableButton;

import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class JCheckBoxTableExample extends JFrame {

	  public JCheckBoxTableExample() {
	    super("JCheckboxTable Example");

	    DefaultTableModel dm = new DefaultTableModel(new String[]{"CheckBox"},2);
//	    dm.setDataVector(new Object[][] { { "Checkbox 1", "foo" },
//	        { "Checkbox 2", "bar" } }, new Object[] { "CheckBox", "String" });

	    JTable table = new JTable(dm);
	    table.getColumn("CheckBox").setCellRenderer(new CheckboxRenderer());
	    table.getColumn("CheckBox").setCellEditor(
	        new CheckboxEditor(new JCheckBox()));
	    JScrollPane scroll = new JScrollPane(table);
	    getContentPane().add(scroll);
	    setSize(400, 100);
	    setVisible(true);
	  }

	  public static void main(String[] args) {
	  
	   
	    JCheckBoxTableExample frame = new JCheckBoxTableExample();
	    frame.addWindowListener(new WindowAdapter() {
	      public void windowClosing(WindowEvent e) {
	        System.exit(0);
	      }
	    });
	  }
	}

class CheckboxEditor extends DefaultCellEditor {
  protected JCheckBox checkbox;

  public CheckboxEditor(JCheckBox _checkBox) {
    super(_checkBox);
    checkbox = new JCheckBox("BOX");
    checkbox.setOpaque(true);
    checkbox.setSelected(true);
//    checkbox.addActionListener(new ActionListener() {
//      public void actionPerformed(ActionEvent e) {
//        fireEditingStopped();
//      }
//    });
  }

  public Component getTableCellEditorComponent(JTable table, Object value,
      boolean isSelected, int row, int column) {
    if (isSelected) {
      checkbox.setForeground(table.getSelectionForeground());
      checkbox.setBackground(table.getSelectionBackground());
    } else {
      checkbox.setForeground(table.getForeground());
      checkbox.setBackground(table.getBackground());
    }
//    System.out.println(value);
//    checkbox.setText((value == null) ? "" : value.toString());
    	checkbox.setText(checkbox.getText());
    return checkbox;
  }
}

class CheckboxRenderer extends JCheckBox implements TableCellRenderer {

  public CheckboxRenderer() {
    setOpaque(true);
  }

  public Component getTableCellRendererComponent(JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) {
    if (isSelected) {
      setForeground(table.getSelectionForeground());
      setBackground(table.getSelectionBackground());
    } else {
      setForeground(table.getForeground());
      setBackground(UIManager.getColor("Checkbox.background"));
    }
//    System.out.println(value);
//    setText((value == null) ? "" : value.toString());
    return this;
  }
  
}
```


----------



## voidee (9. Jan 2009)

```
package jtableButton;

import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class JCheckBoxTableExample extends JFrame {

     public JCheckBoxTableExample() {
       super("JCheckboxTable Example");

       DefaultTableModel dm = new DefaultTableModel(new String[]{"CheckBox"},2);
//       dm.setDataVector(new Object[][] { { "Checkbox 1", "foo" },
//           { "Checkbox 2", "bar" } }, new Object[] { "CheckBox", "String" });

       JTable table = new JTable(dm);
       table.getColumn("CheckBox").setCellRenderer(new BooleanCellRenderer());
       table.getColumn("CheckBox").setCellEditor(new BooleanCellEditor());
       JScrollPane scroll = new JScrollPane(table);
       getContentPane().add(scroll);
       setSize(400, 100);
       setVisible(true);
     }

     public static void main(String[] args) {
    
      
       JCheckBoxTableExample frame = new JCheckBoxTableExample();
       frame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
           System.exit(0);
         }
       });
     }

	class BooleanCellEditor extends DefaultCellEditor {
	
		public BooleanCellEditor() {
				super(new JCheckBox());
				JCheckBox checkBox = (JCheckBox)getComponent();
				checkBox.setHorizontalAlignment(JCheckBox.CENTER);
		}
		
	
	}

	class BooleanCellRenderer extends JCheckBox implements TableCellRenderer {
	
		public BooleanCellRenderer() {
			super();
			setHorizontalAlignment(JLabel.CENTER);
		}
	
		public Component getTableCellRendererComponent(JTable table, Object value,
				boolean isSelected, boolean hasFocus, int row, int column) {
			
			if (isSelected) {
				setForeground(table.getSelectionForeground());
				setBackground(table.getSelectionBackground());
			} else {
				setForeground(table.getForeground());
				setBackground(UIManager.getColor("Checkbox.background"));
			}
	
			setSelected((value != null && ((Boolean)value).booleanValue()));
			return this;
		}
	 
	}


}  // -- eoclass JCheckBoxTableExample -- //
```

Eigentlich warst du schon auf dem richtigen Weg. Beachte bitte folgende Änderungen:

die Klassen 
- BooleanCellRenderer und
- BooleanCellEditor 
hab ich in die Klasse ...Example reingenommen 

In deinem CellRenderer hast du das "value" gar nicht ausgewertet. Eventuell hast du das mit "isSelected" verwechselt. "isSelected" gibt aber nur an, ob die Tabellenzelle selektiert ist. "value" dagegen enthält den Wert der Zelle. Da du eine JCheckBox verwendest, was vom Model her nichts anderes als ein Boolean ist, kommt dort null oder ein Boolean Wert an.
Wenn du nicht sicher bist einfach mit value.getClass().getName() den Namen ausgeben lassen. null bedeute, dass noch kein Wert da ist (in deinem Beispiel kommen null-Werte, da du der Table angibst 2 Zeilen darzustellen, aber im Modell keine Werte dafür setzt).

Den Editor / Renderer hab ich verallgemeinert, da ja Boolean dargestellt (visualisiert oder ge-rendert) und editiert werden. Dass man dazu geschickterweise eine JCheckBox verwendet ist zwar zeckmäßig, würde ich aber nicht in die entsprechenden Klassennamen einfliessen lassen.

Gruß
Tom


----------



## Verjigorm (9. Jan 2009)

Vielen Dank, das muss ich mir zuhause nochmal ganz genau anschauen, irgendwie komm ich nach dem 3-4.Mal damit immer noch nicht klar


----------



## xewat (28. Sep 2011)

hey,
ich habe ein großes problem. ich habe eine methode ausdrucken und der erstellt ein pdf datei.  ich möchte jetzt chekboxen vor jeder datensatz haben damit man auswählen kann was man drucken möchte.
ich habe komme echt nicht weiter. hier ist ein abschnitt des queltexts:

.....

```
jTableAusgabeModel =  new DefaultTableModel();
					jTableAusgabe = new JTable(jTableAusgabeModel);
					jScrollPaneAusgabe.setViewportView(jTableAusgabe);
					jTableAusgabe.setModel(jTableAusgabeModel);
//hier kommen die neuen daten sätze von rs (resultset)

							while(rs.next())
							{
Object[] rowData=   {Boolean.class,rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7),rs.getString(8)};			
						((DefaultTableModel) jTableAusgabeModel).addRow(rowData);
							}
```

ich suche nach wochen durch ganze google. da kamen eure lösung mir am logischsten vor aber ich konnte es nirgend einbauen nicht am anfang (da es noch keine datensätze da gibt) und auch nicht am ende (hat irgendwie immer fehler gezeigt meine unknownsource und ich habe natürlich den spalten namen von checkbox zu numerischen 1 geändert usw.)


----------

