Java 点击按钮后如何更改JTable单元格的颜色?
此代码创建了一个表,其中单元格为ImageIcon.class。通过单击按钮,我希望能够更改相应单元格中ImageIcon的颜色。如果我删除“c instanceof Icon”,代码将设置整个单元格的背景。否则,颜色根本不会改变。我想完全更改渲染器中指定的16x16图标的颜色Java 点击按钮后如何更改JTable单元格的颜色?,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,此代码创建了一个表,其中单元格为ImageIcon.class。通过单击按钮,我希望能够更改相应单元格中ImageIcon的颜色。如果我删除“c instanceof Icon”,代码将设置整个单元格的背景。否则,颜色根本不会改变。我想完全更改渲染器中指定的16x16图标的颜色 public class Test { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() {
public class Test {
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("CheckTable");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTable tableCabin = new JTable(new CabinTableModel(nrows,ncols));
TableCellRenderer defaultRenderer = tableCabin.getDefaultRenderer(ImageIcon.class);
tableCabin.setDefaultRenderer(ImageIcon.class, new CabinColumnRenderer(defaultRenderer)
{
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
row, column);
if (c instanceof Icon)
{
if (row == selectedRow && column == 1)
{
c.setForeground(Color.black);
c.setBackground(Color.red);
}
else
{
c.setForeground(Color.black);
c.setBackground(null);
}
}
return c;
}
});
JTextField textfield = new JTextField(10);
textfield.setText("5");
JButton but = new JButton("Set");
but.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
selectedRow = Integer.parseInt(textfield.getText().toString());
table.repaint();
}
});
f.add(table);
f.add(textfield);
f.add(but);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}
import java.awt.Color;
import java.awt.Component;
import javax.swing.Icon;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
public class CabinColumnRenderer implements TableCellRenderer
{
private TableCellRenderer delegate;
public CabinColumnRenderer(TableCellRenderer defaultRenderer)
{
this.delegate = defaultRenderer;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = delegate.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
if (c instanceof Icon)
{
c.setBackground(Color.red);
}
return c;
}
}
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.table.AbstractTableModel;
@SuppressWarnings("serial")
public class CabinTableModel extends AbstractTableModel
{
private String columnNames[];
private Class<?>[] columns;
private int rows;
private int cols;
private ArrayList<Object[]> data;
public CabinTableModel(int rows, int cols)
{
this.rows = rows;
this.cols = cols;
columnNames = new String[cols];
columns = new Class<?>[cols];
for (int i=0; i<cols; i++)
{
columns[i] = ImageIcon.class;
columnNames[i] = "A"+i;
}
this.data = new ArrayList<Object[]>();
for (int i = 0; i < rows; i++)
{
Object[] row = new Object[this.cols];
this.data.add(row);
for (int j=1; j<cols; j++)
row[j] = createIcon();
}
}
private Icon createIcon()
{
return new Icon()
{
private Color color = Color.green;
public int getIconHeight()
{
return 16;
}
public int getIconWidth()
{
return 16;
}
public void paintIcon(Component c, Graphics g, int x, int y)
{
g.setColor(color);
g.fillRect(x, y, getIconWidth(), getIconHeight());
}
};
}
@Override
public Class<?> getColumnClass(int columnIndex)
{
return this.columns[columnIndex];
}
public int getColumnCount()
{
return cols;
}
public int getRowCount()
{
return rows;
}
public Object getValueAt(int row, int col)
{
return data.get(row)[col];
}
@Override
public String getColumnName(int col)
{
return columnNames[col];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex)
{
return false;
}
@Override
public void setValueAt(Object value, int row, int col)
{
data.get(row)[col] = value;
fireTableCellUpdated(row, col);
}
public void deleteRows(int startIndex, int count)
{
int index = startIndex + count - 1;
while (index >= startIndex)
{
data.remove(index);
index--;
}
fireTableRowsDeleted(startIndex, startIndex + count - 1);
}
}
公共类测试{
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame f=新JFrame(“检查表”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTable tableCabin=新JTable(新CabinTableModel(nrows,ncols));
TableCellRenderer-defaultRenderer=tableCabin.getDefaultRenderer(ImageIcon.class);
tableCabin.setDefaultRenderer(ImageIcon.class,新的CabinColumnRenderer(defaultRenderer)
{
@凌驾
公共组件GetTableCellRenderComponent(JTable表,
对象值,布尔isSelected,布尔hasFocus,int行,
int列){
组件c=super.getTableCellRenderComponent(表、值、isSelected、hasFocus、,
行、列);
if(c instanceof图标)
{
如果(行==selectedRow&&column==1)
{
c、 设置前景(颜色为黑色);
c、 挫折地面(颜色:红色);
}
其他的
{
c、 设置前景(颜色为黑色);
c、 倒退(空);
}
}
返回c;
}
});
JTextField textfield=新的JTextField(10);
textfield.setText(“5”);
JButton但=新JButton(“Set”);
但是.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
selectedRow=Integer.parseInt(textfield.getText().toString());
表1.repaint();
}
});
f、 增加(表);
f、 添加(文本字段);
f、 添加(但);
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
});
}
}
导入java.awt.Color;
导入java.awt.Component;
导入javax.swing.Icon;
导入javax.swing.JTable;
导入javax.swing.table.TableCellRenderer;
公共类CabinColumnRenderer实现TableCellRenderer
{
私人代表;
公共CabinColumnRenderer(TableCellRenderer-defaultRenderer)
{
this.delegate=defaultRenderer;
}
公共组件GetTableCellRenderComponent(JTable表、对象值、,
布尔值(已选择,布尔值为焦点,整数行,整数列)
{
Component c=delegate.GetTableCellRenderComponent(表、值、isSelected、,
hasFocus(焦点、行、列);
if(c instanceof图标)
{
c、 挫折地面(颜色:红色);
}
返回c;
}
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Graphics;
导入java.util.ArrayList;
导入javax.swing.Icon;
导入javax.swing.ImageIcon;
导入javax.swing.table.AbstractTableModel;
@抑制警告(“串行”)
公共类CabinTableModel扩展了AbstractTableModel
{
私有字符串列名称[];
私有类[]列;
私有int行;
私人公司;
私有数组列表数据;
公共车厢模型(整数行,整数列)
{
this.rows=行;
this.cols=cols;
columnNames=新字符串[cols];
列=新类[cols];
对于(int i=0;i),则更改单元格的图标。不需要自定义渲染器。@camickr:请给出一个示例,请参见: