Warum wird ein boolescher Wert in JTable anstelle von einem Kontrollkästchen als wahr / falsch angezeigt?

  • Sollte der neue Boolean nicht als Kontrollkästchen angezeigt werden? Es wird stattdessen als wahrer / falscher Zeichenfolgenwert angezeigt. So fülle ich die Daten auf:

         Object[] columnNames4 = {"Name", "City", "Checkbox"};
        Object[][] data = {
        {"john smith",
         "x", new Boolean(false)},
        {"jenny m",
         "y", new Boolean(false)}
         };
        JTable table4 = new JTable(data, columnNames4);
        JScrollPane S3 = new JScrollPane(table4);
        S3.setPreferredSize(new Dimension(300, 300));
     
    27 February 2015
    Shog9
2 answers
  • Erstellen Sie eine Unterklasse von AbstractTableModel und geben Sie Boolean.class in der Methode getColumnClass () für die gewünschte Spalte zurück.

    27 February 2015
    keuleJ
  • Sie müssen einen TableCellRenderer und einen TableCellEditor einrichten.

    siehe http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

    Einmal Sie haben den Renderer / Editor definiert. Sie können

    • den Renderer / Editor als Standardrender für einen Typ table.setDefaultRenderer(Boolean.class, new MyBooleanRender()); table.setDefaultEditor(Boolean.class, new MyBooleanCellEditor());

    • definiert den Renderer / Editor in einer Spalte TableColumnModel tcm = table.getColumnModel(); tcm.getColumn(4).setCellRenderer(new MyBooleanRender()); tcm.getColumn(4).setCellEditor(new MyBooleanCellEditor());


    • Sie können ein Kontrollkästchen für cellRender definieren:

       public class MyBooleanRender extends JCheckBox
      implements TableCellRenderer {
      
      private JCheckBox checkBox = this;
      
      /**
       * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent
       * (javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
       */
      public Component getTableCellRendererComponent(
          JTable tbl,
          Object value,
          boolean isSelected,
          boolean hasFocus,
          int row,
          int column) {
          boolean val = false;
      
          if (Common.isEmpty(value)) {
              checkBox.setSelected(false);
          } else {
      
              try {
                  val = ((Boolean) value).booleanValue();
              } catch (Exception e) {
              }
              checkBox.setSelected(val);
          }  
      
          if (Common.OPTIONS.highlightEmpty.isSelected() && value == Common.MISSING_VALUE) {
              checkBox.setBackground(Common.EMPTY_COLOR);
          } else if (value == Common.MISSING_REQUIRED_VALUE) {
              checkBox.setBackground(Common.MISSING_COLOR);
          } else {
              ...
          }
      
          checkBox.setSelected(val);
          return checkBox;
      }
      }
       
    • Für einen CheckboxEditor können Sie die DefaultCellEditor-Klasse verwenden.

    27 February 2015
    Shog9