JTable come funzionaEditor funziona

Non capisco come funziona prepareEditor, non sono in grado di impostare le regole di visibilità per prepareRenderer con Action da prepareEditor, come ho catturato nell’immagine allegata

inserisci la descrizione dell'immagine qui

le regole per la 1.a riga funzionano come mi aspettavo, altre TableCell non sono visibili se JCheckBox non è selezionato (anche con hightlighter di selezione JTable), ma se seleziono JCheckBox in 1.st TableColumn, non riesco a visualizzare solo la regola + Mail TableColumn, solo per mostrare tutti i componenti in TableRow, come posso ottenerlo

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, "[email protected]", false, "00 000 000"}, {false, "Edd", false, "[email protected]", false, "00 000 000"}, {false, "Paul", false, "[email protected]", false, "00 000 000"}, {false, "ZOO", false, "[email protected]", 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(); } }); } } 

+++

EDIT davvero niente baterry incluso, non riesco a vedere la foresta per gli alberi 🙁

grazie a @camickr per il calcio tra gli occhi, ci sono stati molti grandi errori / problemi ovunque …

inserisci la descrizione dell'immagine quiinserisci la descrizione dell'immagine quiinserisci la descrizione dell'immagine quiinserisci la descrizione dell'immagine qui

 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, "[email protected]", false, "00 000 000"}, {false, "Edd", false, "[email protected]", false, "00 000 000"}, {false, "Paul", false, "[email protected]", false, "00 000 000"}, {false, "ZOO", false, "[email protected]", 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(); } }); } } 

Penso che il prepareRenderer(...) dovrebbe essere:

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

Quindi si dovrebbe sbarazzarsi del codice prepareEditor(...) . Invece dovresti avere più logica nel metodo isCellEditable(...) . Qualcosa di simile a:

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