使用getTableCellRendererComponent NOTHING HAPPENDS更改颜色JTable单元格

时间:2017-02-11 18:59:01

标签: java swing jtable

我正在尝试更改JTable中某些单元格的颜色。我试图在一个简单的例子中覆盖getTableCellRendererComponent,它很好用。但是当我在我的项目中做同样的事情时,没有什么变化......

我的JTa和我的JTable在一个像这样的盒子里面了:

boxTable=Box.createHorizontalBox();
box2Table.add(boxTable);

//JTable                    
tablaContador = new JTable(datosContador,cabeceraContador);

//MODIF COLOR
tablaContador.setDefaultRenderer(Object.class, new ColorRenderer());

这样做的:

System.out.println(tablaContador.getColumnClass(3));

我知道setDefaultRenderer的第一个参数是Object.class 我不知道问题是否在这里......我在表中只有字符串,但我尝试过String.class并且没有任何反应

然后我修改了JTable的一些细胞:

tablaContador.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
boxTable.add(tablaContador);


//Align cells
for (int i=0; i<cabeceraContador.length;i++){
tablaContador.getColumnModel().getColumn(i).setCellRenderer(alinearCeldas);
                }

//Modify cells' width
tablaContador.getColumnModel().getColumn(0).setMinWidth(150);
for (int i=1; i<cabeceraContador.length;i++){
    tablaContador.getColumnModel().getColumn(i).setMaxWidth(40);
}

//Scroll for the Table
scrollContador=new JScrollPane(tablaContador,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

scrollContador.setPreferredSize(new Dimension(1000,80));
scrollContador.setMinimumSize(new Dimension(1000,80));
scrollContador.setMaximumSize(new Dimension(2000,80));

//Add scroll to the box         
box2Table.add(scrollContador);

我的ColorRenderer类是:

public class ColorRenderer extends DefaultTableCellRenderer{

    private Component c;

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column) {

        c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);


        c.setBackground(Color.BLUE);            


        return c;
    }


}

Table result

所以它在我的项目中不起作用我不知道为什么

任何想法?

thaks!

1 个答案:

答案 0 :(得分:2)

我明白了:

tablaContador.setDefaultRenderer(Object.class, new ColorRenderer());

然后我看到了:

for (int i=0; i<cabeceraContador.length;i++)
{
    tablaContador.getColumnModel().getColumn(i).setCellRenderer(alinearCeldas);
}

将渲染器分配给特定列优先于设置默认渲染器,因此永远不会使用颜色渲染器。

不完全是你想要做的,但我猜你需要将颜色渲染逻辑添加到对齐渲染器。换句话说,所有渲染逻辑都必须包含在单个渲染器中。您无法合并多个渲染器。

以下是自定义渲染器的简单示例:

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableRenderer extends JPanel
{
    public TableRenderer()
    {
        String[] columnNames = {"String", "Integer"};
        Object[][] data =
        {
            {"A", new Integer(1)},
            {"B", new Integer(2)},
            {"C", new Integer(10)},
            {"D", new Integer(4)}
        };

        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable( model );
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );

        //  Override default renderer on a specific column

        TableCellRenderer colorRenderer = new ColorRenderer();
        table.getColumnModel().getColumn(1).setCellRenderer( colorRenderer );
    }

    /*
    **  Color the focused cell
    */
    class ColorRenderer extends DefaultTableCellRenderer
    {
        public ColorRenderer()
        {
            super();
            setHorizontalAlignment(JLabel.RIGHT);
        }

        @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 (isSelected)
                setBackground( table.getSelectionBackground() );
            else
            {
                setBackground( null );

                try
                {
                    int number = Integer.parseInt( value.toString() );

                    if (number > 9)
                        setBackground( Color.RED );
                }
                catch(Exception e) {}
            }

            return this;
        }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Color Renderer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TableRenderer());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}
相关问题