JTable cómo funciona el preparadorEditor

No entiendo cómo funciona prepareEditor, no puedo establecer reglas de visibilidad para prepareRenderer con Action from prepareEditor, como capturé en la imagen adjunta.

enter image description here

las reglas para la 1.ª fila funcionan como esperaba, otras TableCells no se pueden ver si JCheckBox no está seleccionado (con JTable selection hightlighter también), pero si selecciono JCheckBox en 1.st TableColumn, entonces no puedo mostrar solo Rule + Mail TableColumn, solo para mostrar todos los componentes en TableRow, ¿cómo puedo archivar eso?

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(); } }); } } 

+++

EDITAR realmente no incluye baterias, no puedo ver el bosque por los árboles 🙁

gracias a @camickr por patada entre los ojos, hubo muchos errores grandes / problemas en todas partes …

enter image description hereenter image description hereenter image description hereenter image description here

 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) && (Boolean) getValueAt(row, 2)) { return c; } else if ((column == 2 || column == 3) && (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) && (Boolean) getValueAt(row, 2)) { return c; } else if ((column == 2 || column == 3) && (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(); } }); } } 

Creo que el prepareRenderer(...) debería ser:

  public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); if ((column == 2 || column == 3) && (Boolean)getValueAt(row, 0)) { return c; } // if (column == 0 || column == 1 || (Boolean) getValueAt(row, 0)) { if (column == 0 || column == 1) { return c; } return Box.createRigidArea(c.getPreferredSize()); } 

Entonces debería deshacerse del código prepareEditor(...) . En su lugar, debería tener más lógica en el isCellEditable(...) . Algo como:

  public boolean isCellEditable(int row, int column) { if (column == 0) return true; if (column == 1 || column == 4 || column == 5) return false; return (Boolean)getValueAt(row, 0); }