[英]Set background color for particular row of JTable at runtime
我正在使用netbeans IDE7.4,我在運行時向JTable
添加行,現在我想為特定行設置背景顏色。
現在的問題是,當更改該行的值時,該特定行的顏色不會更改,當我向上或向下滾動表時,將應用更改。
如何在運行時刷新表? 如何在運行時設置特定行的背景顏色?
這是用於着色特定行的渲染器類:
public class MyCellRenderer extends javax.swing.table.DefaultTableCellRenderer
{
public java.awt.Component getTableCellRendererComponent(javax.swing.JTable table, java.lang.Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
final java.awt.Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Object val=table.getValueAt(row, 2);
String sval=val.toString();
sval=sval.replaceAll(":","");
int ival=Integer.parseInt(sval);
if(ival==0)
{
cellComponent.setForeground(Color.black);
cellComponent.setBackground(Color.red);
}
else
{
cellComponent.setBackground(Color.white);
cellComponent.setForeground(Color.black);
}
if (isSelected)
{
cellComponent.setForeground(table.getSelectionForeground()); cellComponent.setBackground(table.getSelectionBackground());
}
return cellComponent;
}
}
並且像這樣分配給jtable:
newViewTable.setDefaultRenderer(Object.class,new MyCellRenderer());
newViewTable是JTable的名稱。
如何在運行時設置特定行的背景顏色?
使用表格單元格渲染器。 有關詳細信息,請參見如何使用表:使用自定義渲染器 。
在某些時候,您需要告訴表格內容已經以某種方式發生了變化。
如果您正在使用基於AbstractTableModel
的TableModel
,則可以使用fireTableXxx
事件,例如fireTableCellUpdate(row, col)
。 這將告知JTable
模型已更改並導致重新繪制表格...
您可能希望考慮使用fireTablesRowsUpdated
因為這將導致JTable
更新整個行。
如果您在模型上使用setValueAt
來更改值,則需要調用相應的事件觸發器...
更新了運行示例
所以,基於你的MyCellRenderer
渲染器,我做了這個例子,它工作得很好......
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class TestTable {
public static void main(String[] args) {
new TestTable();
}
public TestTable() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final DefaultTableModel model = new DefaultTableModel(
new Object[]{"A", "B", "C"},
0
);
model.addRow(new Object[]{"A", "B", "1"});
model.addRow(new Object[]{"C", "D", "0"});
model.addRow(new Object[]{"E", "F", "1"});
model.addRow(new Object[]{"G", "H", "0"});
JTable table = new JTable(model);
table.setDefaultRenderer(Object.class, new MyCellRenderer());
JButton btn = new JButton("Add");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
model.addRow(new Object[]{"N", "O", (int)(Math.round(Math.random() * 1))});
}
});
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table));
frame.add(btn, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MyCellRenderer extends javax.swing.table.DefaultTableCellRenderer {
public java.awt.Component getTableCellRendererComponent(javax.swing.JTable table, java.lang.Object value, boolean isSelected, boolean hasFocus, int row, int column) {
final java.awt.Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Object val = table.getValueAt(row, 2);
String sval = val.toString();
sval = sval.replaceAll(":", "");
int ival = Integer.parseInt(sval);
if (ival == 0) {
cellComponent.setForeground(Color.black);
cellComponent.setBackground(Color.red);
} else {
cellComponent.setBackground(Color.white);
cellComponent.setForeground(Color.black);
}
if (isSelected) {
cellComponent.setForeground(table.getSelectionForeground());
cellComponent.setBackground(table.getSelectionBackground());
}
return cellComponent;
}
}
}
現在的問題是,你在做什么不同?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.