Swing:表格单元格渲染不适用于 JXTable?

标签 swing tablecellrenderer jxtable

我试图根据某些行项目的值覆盖 JXTable 的突出显示颜色。这是一个示例,如果行项目值具有 getNumber() % 2 == 0,则突出显示为绿色。 .

它适用于 JTable,但对于 JXTable,看起来表格单元格渲染器不起作用,除非选择了有问题的行。 为什么它会这样,我该如何解决?

enter image description here enter image description here

import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import org.jdesktop.swingx.JXTable;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.EventTableModel;

public class TableRendererExample {
    static public enum ItemKey {
        NAME("name") {
            @Override public String getStringFromItem(Item item) {
                return item.getName();
            }
        }, 
        NUMBER("#") {
            @Override public String getStringFromItem(Item item) {
                return Integer.toString(item.getNumber());
            }
        }, 
        PARENT("parent") {
            @Override public String getStringFromItem(Item item) {
                Item p = item.getParent();
                return (p == null) ? null : p.getName();
            }           
        };

        final private String name;
        ItemKey(String name) { this.name = name; }
        public String getName() { return this.name; }
        abstract public String getStringFromItem(Item item);

        static private ItemKey[] columns = { NAME, NUMBER, PARENT }; 
        static public ItemKey[] getColumns() { return columns; }
    }
    static public class ItemTableFormat implements TableFormat<Item> {
        @Override public int getColumnCount() { 
            return ItemKey.getColumns().length; 
        }
        @Override public String getColumnName(int col) { 
            return ItemKey.getColumns()[col].getName(); 
        }
        @Override public Object getColumnValue(Item item, int col) {
            return ItemKey.getColumns()[col].getStringFromItem(item); 
        }       
    }

    static class Item {
        final private String name;
        final private int number;
        final private Item parent;

        private Item(String name, int number, Item parent) { 
            this.name=name; this.number=number; this.parent=parent;
        }
        static public Item create(String name, int number, Item parent) { 
            return new Item(name, number, parent); 
        }

        public String getName() { return this.name; }
        public int getNumber() { return this.number; }
        public Item getParent() { return this.parent; }
    }

    static public void main(String[] args)
    {

        EventList<Item> items = new BasicEventList<Item>();
        Item x1,x2,x3,x4;
        x1 = Item.create("foo", 1, null);
        items.add(x1);
        x2 = Item.create("bar", 2, x1);
        items.add(x2);
        x3 = Item.create("baz", 1, x1);
        items.add(x3);
        x4 = Item.create("quux", 4, x2);
        items.add(x4);
        items.add(Item.create("wham", 3, x3));
        items.add(Item.create("blam", 11, x3));
        items.add(Item.create("shazaam", 20, x3));
        items.add(Item.create("August", 8, x4));
        items.add(Item.create("September", 9, x4));
        items.add(Item.create("October", 10, x4));
        items.add(Item.create("November", 11, x4));
        items.add(Item.create("December", 12, x4));

        EventList<Item> sortedItems = new SortedList<Item>(items, null);
        final EventList<Item> displayList = sortedItems;
        doit(new JTable(), "JTable cell renderer", displayList);
        doit(new JXTable(), "JXTable cell renderer", displayList);
    }

    static public void doit(JTable table, String title, 
       final EventList<Item> displayList)
    {
        TableFormat<Item> tf = new ItemTableFormat();
        EventTableModel<Item> etm = 
            new EventTableModel<Item>(displayList, tf);

        table.setModel(etm);    
        if (table instanceof JXTable)
        {
            ((JXTable)table).setColumnControlVisible(true);
        }
        TableColumnModel tcm = table.getColumnModel();
        final Color selectedGreen = new Color(128, 255, 128); 
        final Color unselectedGreen =   new Color(224, 255, 224); 
        TableCellRenderer tcr = new DefaultTableCellRenderer() {
            @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);
                Item item = displayList.get(row);
                Color color = null;
                if (item != null && ((item.getNumber() % 2) == 0))
                {
                    color = isSelected ? selectedGreen : unselectedGreen;
                }
                if (color == null)
                {
                    color = isSelected 
                         ? table.getSelectionBackground() 
                         : table.getBackground();
                }
                c.setBackground(color);                                     
                return c;
            }
        };
        for (int i = 0; i < tcm.getColumnCount(); ++i)
        {
            tcm.getColumn(i).setCellRenderer(tcr);
        }

        JPanel panel = new JPanel();
        panel.add(new JScrollPane(table));

        JFrame frame = new JFrame(title);
        frame.getContentPane().add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.pack();
    }
}

最佳答案

我收到了一位 SwingX 人员的回复,他说我需要使用荧光笔(而不是 TableCellRenderer)才能使渲染器正常运行。

有一个hacky的解决方法,但他不推荐它。

关于Swing:表格单元格渲染不适用于 JXTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4856804/

相关文章:

java - 允许用户在 Java Swing 应用程序中复制图像?

java - 为什么我的 JTable CellRenderer 一直在运行?

java - JTable/JXTable 如何设置列宽?

java - 如何使 JTable 列包含复选框?

java - JXTable 中非常不寻常的单元格突出显示

java - JXTable 排序不正确

java - 如何让 JComboBox 下拉列表比 JComboBox 本身更宽

java - 在 JFrame 中显示异常

java - 如何在类(class)中单独更新外观和感觉干净?

java - JTable所有列右对齐