通常,覆盖基本 Swing 类的方法是一个坏主意。推荐的方法是创建一个Jcomponent
实现TableCellRenderer
并将其应用于表的setDefaultRenderer()
. 请注意,默认情况下,JTable 为 Object、Number 和 Boolean 类型提供其中的 3 个。通常,渲染器看起来像这样:
public class MyRenderer extends JLable, implements TableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// Set up default state here
c.setBackground(Color.white);
c.setForeground(Color.black);
// ...
if (!isRowSelected(row) ) {
c.setBackground((hashMapcontainer
.containsKey(row)) ? Color.GREEN
: getBackground());
}
return c;
}
这为您提供了一个可重用的组件,而不是在您创建它的每个地方都需要扩展 JTable。至于在所有表中选择相同的单元格,这是由于访问全局状态isRowSelected
而hashMapContainer
不是每个实例状态。所有JComponent
s 都有 getClientProperty
和putClientProperty
。这些允许您将自己的状态对象附加到JTable
. 然后你的isRowSelected
become isRowSelected(table, row)
,它只是调用:
MyObject myObj = (MyObject)table.getClientProperty("MySelectionProperty");
myObj.isRowSelected(row);
同样,hashMapContainer
也可以从表中检索:
MyHashContainer myHash = (MyHash)table.getClientProperty("MyHashContainer");
更新:
这对于动态生成的表几乎相同。表创建将如下所示:
JTable t = new JTable();
// other typical table setup, t.setModel(...); etc
t.setDefaultRenderer(String.class, myRenderer);
t.putClientProperty("MySelectionProperty", new MyObject());
t.putClientProperty("MyHashContainer", new MyHashContainer());
值得注意的是,只要渲染器不携带状态,就不需要为每个表创建一个实例。我通常会创建一个并将其用于我的所有表格。
这是上面渲染器的更新,它不使用全局状态,而是查看表中的属性:
public class MyRenderer extends JLable, implements TableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// Pull hashMapContainer from the per-table client properties
MyHashContainer hashMapcontainer = (MyHashContainer)table.getClientProperty("MyHashContainer");
// Set defaults as above
if (!isRowSelected(table, row) ) {
// Same as above
}
return c;
}
// Private method to check for row selection
private boolean isRowSelected(JTable t, int row) {
int[] selectedRows = table.getSelectedRows();
for (int i = 0; i < selectedRows.length; i++) {
if (selectedRows[i] == row) {
return true;
}
}
return false;
}
}