JTable prepareEditor的工作原理

我不明白prepareEditor是如何工作的,我无法使用prepareEditor中的Action为prepareRenderer设置可见性规则,因为我在附加的Image中捕获了

在此处输入图像描述

1.st行的规则按预期工作,如果没有选择JCheckBox,其他TableCells是不可见的(使用JTable选择hightlighter),但如果我在1.st TableColumn中选择JCheckBox,那么我不能只显示规则+ Mail TableColumn,只显示TableRow中的所有组件,我该怎样才能实现

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

+++

编辑真的没有包括,我看不到森林的树木:-(

多亏了@camickr眼睛之间的踢,各处都有很多重大错误/问题……

在此处输入图像描述在此处输入图像描述在此处输入图像描述在此处输入图像描述

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

我认为prepareRenderer(...)代码应该是:

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

然后你应该摆脱prepareEditor(...)代码。 相反,你应该在isCellEditable(...)方法中有更多的逻辑。 就像是:

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