【问题标题】:JTable Cell ColorJTable 单元格颜色
【发布时间】:2012-10-03 09:45:58
【问题描述】:

谁能给我一个示例,说明如何获取 JTable 中特定单元格的背景颜色?我找不到如何执行此操作的示例。获取单元格中的值而不是单元格的背景颜色的大量示例。

【问题讨论】:

  • 在阅读完答案后,我注意到我误解了你的问题;-) 即使是现在,这仍然是一个次优问题:没有上下文和更多细节(fi 为什么,你想达到什么目标,在哪里/你究竟是如何获得颜色的......)很难正确回答......

标签: java swing colors jtable tablecellrenderer


【解决方案1】:

应该是这样的(根据所有cmets固定):

重要提示:使用 table.prepareRenderer(...) 让 JTable 为您完成所有工作

public Color getTableCellBackground(JTable table, int row, int col) {
    TableCellRenderer renderer = table.getCellRenderer(row, col);
    Component component = table.prepareRenderer(renderer, row, col);
    return component.getBackground();
}

完整演示:

public class TableRenderDemo extends JPanel {

    public TableRenderDemo() {
        super(new GridLayout(1, 0));

        final JTable table = new JTable(new MyTableModel());
        table.setPreferredScrollableViewportSize(new Dimension(600, 200));
        table.setFillsViewportHeight(true);
        table.setDefaultRenderer(Object.class, new MyRenderer());

        table.addMouseListener(new MouseAdapter() {

            public void mouseClicked(MouseEvent e) {
                int row = table.getSelectedRow();
                int col = table.getSelectedColumn();

                JOptionPane.showInternalMessageDialog(TableRenderDemo.this,
                        "Color: " + getTableCellBackground(table, row, col));

                System.out.println("Color: " + getTableCellBackground(table, row, col));
            }
        });

        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }

    public Color getTableCellBackground(JTable table, int row, int col) {
        TableCellRenderer renderer = table.getCellRenderer(row, col);
        Component component = table.prepareRenderer(renderer, row, col);    
        return component.getBackground();
    }

    class MyRenderer implements TableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
            JTextField editor = new JTextField();
            if (value != null) {
                editor.setText(value.toString());
            }
            editor.setBackground((row % 2 == 0) ? Color.white : Color.BLUE);
            return editor;
        }
    }

    class MyTableModel extends AbstractTableModel {

        private String[] columnNames = {"First Name",
            "Last Name",
            "Sport",
            "# of Years",
            "Vegetarian"};
        private Object[][] data = {
            {"Kathy", "Smith",
                "Snowboarding", new Integer(5), new Boolean(false)},
            {"John", "Doe",
                "Rowing", new Integer(3), new Boolean(true)},
            {"Sue", "Black",
                "Knitting", new Integer(2), new Boolean(false)},
            {"Jane", "White",
                "Speed reading", new Integer(20), new Boolean(true)},
            {"Joe", "Brown",
                "Pool", new Integer(10), new Boolean(false)}
        };
        public final Object[] longValues = {"Jane", "Kathy",
            "None of the above",
            new Integer(20), Boolean.TRUE};

        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return data.length;
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("TableRenderDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TableRenderDemo newContentPane = new TableRenderDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                createAndShowGUI();
            }
        });
    }
}

【讨论】:

  • 我尝试了这个示例,并遵循逻辑,但由于某种原因,每个单元格得到 255,255,255,但我有备用行着色,所以我不确定这里发生了什么。跨度>
  • user1154644 你搜了吗,有XxxCellRenderer和PrepareRenderer,而且这段代码没有设置任何Color,也没有给Cell BackGround...,只有骨架的
  • 行高亮是如何应用的?
  • 请在里面找到可运行演示的更新答案。我分别得到 Color: java.awt.Color[r=0,g=0,b=255] 和 Color: java.awt.Color[r=255,g=255,b=255]
  • 已修复。手动配置 tableRenderer 真的是不必要的。谢谢大家。
【解决方案2】:

谁能给我一个示例,说明如何获取 JTable 中特定单元格的背景颜色?我找不到如何执行此操作的示例。

关于获取单元格中的值,而不是单元格的背景颜色的大量示例。

  • 实在忍不住了,请到这个论坛或者什么地方

  • 希望对你有所帮助....

【讨论】:

    【解决方案3】:

    要在单元格0, 0 处获取JTable 颜色,您可以获取单元格组件的背景颜色:

    TableCellRenderer cellRenderer = table.getCellRenderer(0, 0);
    Component rendererComponent = cellRenderer.getTableCellRendererComponent(table, null, false, true, 0, 0);
    Color cellColor = rendererComponent.getBackground();
    

    【讨论】:

    • 如果使用带有一些棘手的基于值的逻辑的自定义渲染器或选择了行,将无法工作。
    • 如果您将正确的行/列传递给 table.getCellRenderer,它将起作用
    • 错了......这不会让你得到table配置后的颜色,见my comment
    【解决方案4】:

    使用 TableCellRenderer

    jTable1 = new javax.swing.JTable(6,6){
    public Component prepareRenderer(
        TableCellRenderer renderer, int row, int column)
    {
    
        Component c = super.prepareRenderer(renderer, row, column);
        if(column==2 && row==4)
        {
           Color color= c.getBackground();// use setBackground to set color and get background to get background of a particular cell
           System.out.println("Color of row=0 and column=0 is "+color);
    
        }
    
        else
        {
            c.setBackground(Color.GREEN);
            setShowGrid(true);
        }
        return c;
    
    }
    };
    

    【讨论】:

    • 没有回答问题(这并不太清楚,承认:-)
    • 你注意到 System.out.println();语句无限执行?我相信方法 prepareRenderer 以某种方式被递归调用。即使您使用“纯”JTable 类的对象而不是您的自定义版本,这是否也是预期的行为?
    • @Prashan 我很久以前就回答过了,我明白答案并不完美。我现在和swing没有联系。是的,我知道答案并不完美。我在摇摆上失去了联系,现在我在 android 上编程。
    • 我只是避免了递归。用以下代码替换 setShowGrid(true) 语句: boolean oldHorizo​​ntalVal = this.showHorizo​​ntalLines;显示水平线=真; firePropertyChange("showHorizo​​ntalLines", oldHorizo​​ntalVal, showHorizo​​ntalLines); boolean oldVerticalVal = this.showVerticalLines;显示垂直线=真; firePropertyChange("showVerticalLines", oldVerticalVal, showVerticalLines);
    猜你喜欢
    • 2015-11-29
    • 2011-08-06
    • 2011-11-03
    • 2018-08-20
    • 2011-08-14
    • 2011-09-24
    • 2017-09-11
    • 2016-05-27
    • 1970-01-01
    相关资源
    最近更新 更多