【问题标题】:JTable changing cells colour's from a given ArrayListJTable 从给定的 ArrayList 更改单元格颜色
【发布时间】:2014-07-20 02:02:25
【问题描述】:

所以我有以下定义错误基本参数的类

public class Error {

public String desc;
public int rowNumber;
public int colNumber;
public int fixNumber;

public Error(String desc,int row, int col, int fix){
    this.desc = desc;
    rowNumber = row++;
    colNumber = col++;
    fixNumber = fix;
}
...

我的 gui 类

public class Gui extends JFrame {

AbstractTableModel model;
JTable table; 

public void start(AbstractTableModel model) { 
    this.model = model;
    table=new JTable(model){
        @Override 
        public boolean isCellEditable(int arg0, int arg1) { 
            return false; 
        }

    }; 

    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);


    TableColumn column = null;
    for (int i = 0; i < model.getColumnCount(); i++) {
            column = table.getColumnModel().getColumn(i);
            column.setPreferredWidth(120);  
            column.setMaxWidth(300);
            column.setMinWidth(50);
            column.setCellRenderer(new customCellRender());
        }



        JScrollPane pane = new JScrollPane(table);  
        pane.setPreferredSize(new Dimension(900,900));
        add(pane); 
        setLayout(new FlowLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        pack();
        setVisible(true); 
}

我试图制作一个 cellRenderer,但目前它没有达到预期的效果。因为它会为所有单元格着色。

@SuppressWarnings("serial")
public class customCellRender extends DefaultTableCellRenderer  {

public Component getTableCellRendererComponent(JTable table, Object value, boolean     isSelected, boolean hasFocus, int row, int column){
    Component c = null;
    c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);   
    c.setBackground(new java.awt.Color(255, 72, 72));

     return c;
}

然后我有一个存储错误类实例的列表。我不知道如何仅根据错误(rowNumber,colNumber)更改表中单元格的颜色。考虑到错误在列表结构中,所以我必须迭代并以某种方式将每个错误列和行传递给渲染器。这可能吗?

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。

标签: java swing colors jtable tablecellrenderer


【解决方案1】:

您的代码为所有单元格着色,因为该组件被重复使用,而不是每次都重新创建。只需添加一个

if (error) {
    c.setBackground(errorBackground);
} else {
    c.setBackground(table.getBackground);
}

需要说明几点:

  1. 不要每次都创建新颜色。它很贵,而且您仍然使用相同的。
  2. 为您的错误使用 Set 以使 contains 快速,否则您的渲染可能会因大量错误而变得非常缓慢。

【讨论】:

  • 好点,但我仍然想知道如何渲染List&lt;Error&gt;errors 内部的表格单元格。所以我遍历每个值并将行号和列号传递给?
  • @user1477957 如果你坚持使用List 的错误,那是你能得到的最好的。 (好吧,也许您可​​以使用空间索引使其成为对数而不是线性)。但是,如果您有一个 Point 对象,该对象具有行和列以及 hash&equals 函数,则可以使用具有恒定访问权限的 HashSet(如答案第 2 点所述)
猜你喜欢
  • 2011-08-06
  • 2011-11-03
  • 1970-01-01
  • 2011-08-14
  • 2014-08-24
  • 2018-08-20
  • 2011-09-24
  • 2020-08-25
  • 2019-09-09
相关资源
最近更新 更多