Java 点击按钮后如何更改JTable单元格的颜色?

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() {

此代码创建了一个表,其中单元格为ImageIcon.class。通过单击按钮,我希望能够更改相应单元格中ImageIcon的颜色。如果我删除“c instanceof Icon”,代码将设置整个单元格的背景。否则,颜色根本不会改变。我想完全更改渲染器中指定的16x16图标的颜色

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:请给出一个示例,请参见: