[英]Colored Table Cells
我想根據第1列中的值給表格單元格上色,如果值不等於第1列中的值,則顏色應為青色,但我的代碼不起作用:
table = new JTable(){
public TableCellRenderer getCellRenderer(int row, int column) {
TableCellRenderer tcr=null;
Color c;
if(column>=1&&getValueAt(row, column)!=null &&getValueAt(row, 1)!=null &&!getValueAt(row, column).equals(getValueAt(row, 1)))
c=Color.CYAN;
else
c=Color.white;
if(getValueAt(row, column) instanceof Boolean) {
tcr= super.getDefaultRenderer(Boolean.class);
} else {
tcr= super.getCellRenderer(row, column);
}
tcr.getTableCellRendererComponent(this, getValueAt(row, column), isCellSelected(row, column) , hasFocus(), row, column).setBackground(c);
return tcr;
}
public TableCellEditor getCellEditor(int row, int column) {
if(getValueAt(row, column) instanceof Boolean) {
return super.getDefaultEditor(Boolean.class);
} else {
return super.getCellEditor(row, column);
}
}
};
table.setModel(new DefaultTableModel(
new Object[][] {
{"Row1", "1","2","3"},
{"Row2", "2","2","3"},
{"Row3", "2","2","2"},
{"Row3", "2","1","2"}
},
new String[] {"Header1", "Header2","Header3","Header4"}
));
必須在TableCellRenderer中決定是否必須突出顯示單元格。 它不能在JTable中進行。 因此,(沒有)沒有理由要重寫JTable中的方法。 相反,您可以將列的CellRenderer設置為TableCellRenderer的自己體現。
在此示例中,列2和3接收“ ColoringCellRenderer”。 如果此單元格中的值不為null且與列1中的值相同,則此ColoringCellRenderer將突出顯示該單元格。
import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class ColoredTableCells
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.getContentPane().add(new JScrollPane(createTable()));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
static JTable createTable()
{
class ColoringTableCellRenderer extends DefaultTableCellRenderer
{
ColoringTableCellRenderer()
{
setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column)
{
super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
if (highlightCell(table, row, column))
{
setBackground(Color.CYAN);
}
else
{
setBackground(Color.WHITE);
}
return this;
}
private boolean highlightCell(JTable table, int row, int column)
{
Object thisValue = table.getValueAt(row, column);
Object referenceValue = table.getValueAt(row, 1);
if (thisValue != null && referenceValue != null)
{
return thisValue.equals(referenceValue);
}
return false;
}
}
JTable table = new JTable();
table.setModel(new DefaultTableModel(new Object[][] {
{ "Row1", "1", "2", "3" },
{ "Row2", "2", "2", "3" },
{ "Row3", "2", "2", "2" },
{ "Row3", "2", "1", "2" } },
new String[] { "Header1", "Header2", "Header3", "Header4" }));
for (int i=2; i<table.getColumnCount(); i++)
{
TableColumn column = table.getColumnModel().getColumn(i);
column.setCellRenderer(new ColoringTableCellRenderer());
}
return table;
}
}
編輯:答案已經被接受,但針對評論,一個不同的版本:
該類使用兩個類“ DelegatingTableCellRenderer”和“ DelegatingTableCellEditor”。 這些類各自接收各自的委托,並且僅設置委托所傳遞的單元格組件的背景色。
這樣,着色表單元格(用於渲染器或編輯器)的功能就與實際渲染器分離了。 因此,可以為例如默認的CellRenderer的Boolean
值(顯示JCheckBox)的背景上色。
import java.awt.Color;
import java.awt.Component;
import java.util.EventObject;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.CellEditorListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
public class ColoredTableCells2
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.getContentPane().add(new JScrollPane(createTable()));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
static JTable createTable()
{
JTable table = new JTable()
{
@Override
public Class<?> getColumnClass(int column)
{
if (column == 0)
{
return Object.class;
}
return Boolean.class;
}
};
table.setDefaultEditor(Boolean.class,
new DelegatingTableCellEditor(table.getDefaultEditor(Boolean.class)));
table.setDefaultRenderer(Boolean.class,
new DelegatingTableCellRenderer(table.getDefaultRenderer(Boolean.class)));
table.setModel(new DefaultTableModel(new Object[][] {
{ "Row1", true, false, true },
{ "Row2", true, true, false },
{ "Row3", false, false, true },
{ "Row3", false, true, false } },
new String[] { "Header1", "Header2", "Header3", "Header4" }));
return table;
}
static class DelegatingTableCellEditor implements TableCellEditor
{
private final TableCellEditor delegate;
DelegatingTableCellEditor(TableCellEditor delegate)
{
this.delegate = delegate;
}
@Override
public Object getCellEditorValue()
{
return delegate.getCellEditorValue();
}
@Override
public boolean isCellEditable(EventObject anEvent)
{
return delegate.isCellEditable(anEvent);
}
@Override
public boolean shouldSelectCell(EventObject anEvent)
{
return delegate.shouldSelectCell(anEvent);
}
@Override
public boolean stopCellEditing()
{
return delegate.stopCellEditing();
}
@Override
public void cancelCellEditing()
{
delegate.cancelCellEditing();
}
@Override
public void addCellEditorListener(CellEditorListener l)
{
delegate.addCellEditorListener(l);
}
@Override
public void removeCellEditorListener(CellEditorListener l)
{
delegate.removeCellEditorListener(l);
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column)
{
Component component =
delegate.getTableCellEditorComponent(
table, value, isSelected, row, column);
if (component instanceof JComponent)
{
JComponent c = (JComponent)component;
c.setOpaque(true);
}
if (highlightCell(table, row, column))
{
component.setBackground(Color.CYAN);
}
else
{
component.setBackground(Color.WHITE);
}
return component;
}
}
static class DelegatingTableCellRenderer extends DefaultTableCellRenderer
{
private final TableCellRenderer delegate;
DelegatingTableCellRenderer(TableCellRenderer delegate)
{
this.delegate = delegate;
}
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
Component component =
delegate.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
if (component instanceof JComponent)
{
JComponent c = (JComponent)component;
c.setOpaque(true);
}
if (highlightCell(table, row, column))
{
component.setBackground(Color.CYAN);
}
else
{
component.setBackground(Color.WHITE);
}
return component;
}
}
private static boolean highlightCell(JTable table, int row, int column)
{
if (column == 1)
{
return false;
}
Object thisValue = table.getModel().getValueAt(row, column);
Object referenceValue = table.getModel().getValueAt(row, 1);
if (thisValue != null && referenceValue != null)
{
return thisValue.equals(referenceValue);
}
return false;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.