Java 彩色表格单元格

Java 彩色表格单元格,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我想根据第1列中的值为表格单元格着色,如果值不等于第1列中的值,则颜色应为青色,但我的代码不起作用: table = new JTable(){ public TableCellRenderer getCellRenderer(int row, int column) { TableCellRenderer tcr=null; Color c; if(column>=1&&

我想根据第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;
    }
}

必须在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;
    }
}

看起来您是在设置JTable的背景色,而不是渲染器?我更新了它,现在它可以工作了-1再次询问最常问的问题之一。。。。(懒得查找副本)看起来您是在设置JTable的背景色,而不是渲染器?我更新了它,我认为它现在可以工作了-1,再次提出了一个最常见的问题。。。。(懒得查找副本)不要同时理解Q和a,然后+1downvoters@mKorbel:我不理解你的评论;-)问题是“我想根据第1列中的值给表格单元格上色,如果值不等于第1列中的值,则颜色应为青色”-好的,如果它们相等,我的代码将它们上色为青色,但这可以用单个
修复
…@Marco13是否可以将彩色单元格与复选框的显示相结合,而不显示true和false?我的意思是,如果模型喜欢新对象[][]{{“Row1”、“1”、“2”、“3”}、{“Row2”、“2”、“3”}、{“Row3”、“2”、“2”、“2”}、{“Row4”、true、false、true},因为if(getValueAt(row,column)instanceof Boolean){返回super.getDefaultEditor(Boolean.class);使这样的复选框基本正确(+1)只是有点吹毛求疵:a)无需再次获取当前值,它作为参数传入b)渲染器最好是自动标记的,即不依赖于其他代码,不将自身设置为比较列的渲染器c)如果用户重新排列列d)没有视觉选择线索,则会中断(也不是像dnd这样的装饰)-但这实际上只是一个次要的旁注,完全可以,例如代码:-)@Jaran我添加了一个带有“新版本”的编辑,我想这就是你在评论中要求的。不要同时理解Q和a,然后+1downvoters@mKorbel当前位置我不理解你的评论;-)问题是“我想根据第1列中的值为表格单元格着色,如果值不等于第1列中的值,则颜色应为青色“-好的,如果它们相等,我的代码将它们涂成青色,但这可以通过单个
…@Marco13是否可以将彩色单元格和复选框的显示组合起来,而不是真和假?我的意思是,如果模型喜欢新对象[][{{“Row1”、“1”、“2”、“3”},{“Row2”、“2”、“3”},{“Row3”,“2”,“2”,“2”},{“Row4”,true,false,true}}因为if(getValueAt(row,column)instanceof Boolean){return super.getDefaultEditor(Boolean.class);使这样的复选框基本正确(+1)只是有点吹毛求疵:a)无需再次获取当前值,它作为参数传入b)渲染器最好是autark,即不依赖其他代码,不将自身设置为比较列的渲染器c)如果用户重新排列列d)将中断,没有视觉选择线索(也没有其他装饰,如dnd)-但这实际上只是一个次要的旁注,非常好,例如代码:-)@Jaran我添加了一个带有“新版本”的编辑,我想这就是你在评论中要求的。