title: JTable how prepareEditor works
body: <p>I don't understand how prepareEditor works, I'm not able set visibility rules for prepareRenderer with Action from prepareEditor, as I captured in attached Image</p>
  
  <p><img src="https://i.stack.imgur.com/WQWjq.jpg" alt="enter image description here"> </p>
  
  <p>rules for 1.st row works as I expected, other TableCells are un-visible if JCheckBox isn't selected (with JTable selection hightlighter too), but if I select JCheckBox in 1.st TableColumn, then I can't shows only Rule + Mail TableColumn, only to shows all Components in the TableRow, how can I archieve that</p>
  
  <pre><code>import java.awt.Component;
  import javax.swing.*;
  import javax.swing.event.*;
  import javax.swing.table.*;
  
  public class TableWithCheckBoxOrBlank {
  
      private Object[] columns = new Object[]{
          "Select", "Name", "Rule", "Mail", "Include", "Phone"};
      private Object[][] data = {
          {false, "Bill", false, "Blabla@bla", false, "00 000 000"},
          {false, "Edd", false, "Blabla@bla", false, "00 000 000"},
          {false, "Paul", false, "Blabla@bla", false, "00 000 000"},
          {false, "ZOO", false, "Blabla@bla", false, "00 000 000"}};
  
      public void makeUI() {
          DefaultTableModel model = new DefaultTableModel(data, columns) {
  
              private static final long serialVersionUID = 1L;
  
              @Override
              public boolean isCellEditable(int row, int column) {
                  return column != 1;
              }
  
              @Override
              public Class getColumnClass(int columnIndex) {
                  switch (columnIndex) {
                      case 0:
                          return Boolean.class;
                      case 1:
                          return String.class;
                      case 2:
                          return Boolean.class;
                      case 3:
                          return String.class;
                      case 4:
                          return Boolean.class;
                      case 5:
                          return String.class;
                  }
                  return null;
              }
          };
          final JTable table = new JTable(model) {
  
              private static final long serialVersionUID = 1L;
  
              @Override
              public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                  Component c = super.prepareRenderer(renderer, row, column);
                  if (column == 0 || column == 1 || (Boolean) getValueAt(row, 0)) {
                      return c;
                  }
                  return Box.createRigidArea(c.getPreferredSize());
              }
  
              @Override
              public Component prepareEditor(TableCellEditor editor, int row, int column) {
                  Component c = super.prepareEditor(editor, row, column);
                  if (column == 0 || column == 1 || (Boolean) getValueAt(row, 0)) {
                      return c;
                  }
                  return Box.createRigidArea(c.getPreferredSize());
              }
          };
          model.addTableModelListener(new TableModelListener() {
  
              @Override
              public void tableChanged(TableModelEvent e) {
                  if (e.getColumn() == 0) {
                      if ((Boolean) table.getValueAt(table.getSelectedRow(), 0)) {
                          table.setValueAt(Boolean.FALSE, table.getSelectedRow(), 2);
                      }
                      table.repaint();
                  }
              }
          });
          JScrollPane scroll = new JScrollPane(table);
          table.setPreferredScrollableViewportSize(table.getPreferredSize());
          JFrame frame = new JFrame("Table With Check Box Or Blank");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setLocation(150, 150);
          frame.add(scroll);
          frame.pack();
          frame.setVisible(true);
      }
  
      public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
  
              @Override
              public void run() {
                  new TableWithCheckBoxOrBlank().makeUI();
              }
          });
      }
  }
  </code></pre>
  
  <p>+++</p>
  
  <p>EDIT really no baterry included, I can't see the forest for the trees :-(</p>
  
  <p>thanks to @camickr for kick between eyes, there were lots of big mistakes/problems everywhere...</p>
  
  <p><img src="https://i.stack.imgur.com/j0bu3.png" alt="enter image description here">
  <img src="https://i.stack.imgur.com/mYdwu.png" alt="enter image description here">
  <img src="https://i.stack.imgur.com/KjuDP.png" alt="enter image description here">
  <img src="https://i.stack.imgur.com/hNLuZ.png" alt="enter image description here"></p>
  
  <pre><code>import java.awt.Component;
  import javax.swing.*;
  import javax.swing.event.*;
  import javax.swing.table.*;
  
  public class TableWithCheckBoxOrBlank {
  
      private Object[] columns = new Object[]{
          "Select", "Name", "Rule", "Mail", "Include", "Phone"};
      private Object[][] data = {
          {false, "Bill", false, "Blabla@bla", false, "00 000 000"},
          {false, "Edd", false, "Blabla@bla", false, "00 000 000"},
          {false, "Paul", false, "Blabla@bla", false, "00 000 000"},
          {false, "ZOO", false, "Blabla@bla", false, "00 000 000"}};
  
      public void makeUI() {
          DefaultTableModel model = new DefaultTableModel(data, columns) {
  
              private static final long serialVersionUID = 1L;
  
              @Override
              public boolean isCellEditable(int row, int column) {
                  if (column == 0 || column == 2 || column == 4) {
                      return true;
                  }
                  if (column == 1 || column == 3 || column == 5) {
                      return false;
                  }
                  return (Boolean) getValueAt(row, 0);
              }
  
              @Override
              public Class getColumnClass(int columnIndex) {
                  switch (columnIndex) {
                      case 0:
                          return Boolean.class;
                      case 1:
                          return String.class;
                      case 2:
                          return Boolean.class;
                      case 3:
                          return String.class;
                      case 4:
                          return Boolean.class;
                      case 5:
                          return String.class;
                  }
                  return null;
              }
          };
          final JTable table = new JTable(model) {
  
              private static final long serialVersionUID = 1L;
  
              @Override
              public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                  Component c = super.prepareRenderer(renderer, row, column);
                  if ((column == 4 || column == 5) &amp;&amp; (Boolean) getValueAt(row, 2)) {
                      return c;
                  } else if ((column == 2 || column == 3) &amp;&amp; (Boolean) getValueAt(row, 0)) {
                      return c;
                  } else if (column == 0 || column == 1) {
                      return c;
                  }
                  return Box.createRigidArea(c.getPreferredSize());
              }
  
              @Override
              public Component prepareEditor(TableCellEditor editor, int row, int column) {
                  Component c = super.prepareEditor(editor, row, column);
                  if ((column == 4 || column == 5) &amp;&amp; (Boolean) getValueAt(row, 2)) {
                      return c;
                  } else if ((column == 2 || column == 3) &amp;&amp; (Boolean) getValueAt(row, 0)) {
                      return c;
                  } else if (column == 0 || column == 1) {
                      return c;
                  }
                  return Box.createRigidArea(c.getPreferredSize());
              }
          };
          model.addTableModelListener(new TableModelListener() {
  
              @Override
              public void tableChanged(TableModelEvent e) {
                  if (e.getColumn() == 0) {
                      if ((Boolean) table.getValueAt(table.getSelectedRow(), 0)) {
                          table.setValueAt(Boolean.FALSE, table.getSelectedRow(), 2);
                      }
                      table.repaint();
                  } else if (e.getColumn() == 2) {
                      if ((Boolean) table.getValueAt(table.getSelectedRow(), 2)) {
                          table.setValueAt(Boolean.FALSE, table.getSelectedRow(), 4);
                      }
                      table.repaint();
                  }
              }
          });
          JScrollPane scroll = new JScrollPane(table);
          table.setPreferredScrollableViewportSize(table.getPreferredSize());
          JFrame frame = new JFrame("Table With Check Box Or Blank");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setLocation(150, 150);
          frame.add(scroll);
          frame.pack();
          frame.setVisible(true);
      }
  
      public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
  
              @Override
              public void run() {
                  new TableWithCheckBoxOrBlank().makeUI();
              }
          });
      }
  }
  </code></pre>