简体   繁体   English

着色jTable行

[英]Coloring jTable row

I want to color specific rows in jTable..i did it for columns by using this code, 我想为jTable中的特定行着色..我使用此代码为列做了,

private class CustomCellRenderer extends DefaultTableCellRenderer {

/* (non-Javadoc)
 * @see    
javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
 */

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

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

//Set foreground color
// rendererComp.setForeground(Color.red);
//Set background color
  rendererComp .setBackground(Color.pink);

 return rendererComp ;
 }

}

And i call the above code using, 我用上面的代码调用,

 jTable1.getColumnModel().getColumn(3).setCellRenderer(new CustomCellRenderer());

But i want to do the same for rows in jTable..There's no getColumnModel() or getColumn() in the case of rows..So what's the alternate way for doing that? 但是我想对jTable中的行做同样的事情。在行的情况下没有getColumnModel()或getColumn()。那么这样做的替代方法是什么? I am doing it in Netbeans by using Java Swing.. 我是通过使用Java Swing在Netbeans中完成的。

Here is an example on how you can combine both column colors and row color. 以下是如何组合列颜色和行颜色的示例。 You basically perform tests in the TableCellRenderer to see if the background should be of one color or another. 您基本上在TableCellRenderer中执行测试,以查看背景是否应该是一种颜色或另一种颜色。

import java.awt.Color;
import java.awt.Component;
import java.util.Enumeration;
import java.util.Vector;

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.TableCellRenderer;
import javax.swing.table.TableColumn;

public class TestTable {

    public class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setBackground(null);
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            setText(String.valueOf(value));
            boolean interestingRow = row % 5 == 2;
            boolean secondColumn = column == 1;
            if (interestingRow && secondColumn) {
                setBackground(Color.ORANGE);
            } else if (interestingRow) {
                setBackground(Color.YELLOW);
            } else if (secondColumn) {
                setBackground(Color.RED);
            }
            return this;
        }

    }

    private JFrame f;
    private JTable table;

    protected void initUI() {
        Vector<Vector<Object>> data = new Vector<Vector<Object>>();
        Vector<String> columNames = new Vector<String>();
        columNames.add("Col 0");
        columNames.add("Col 1");
        columNames.add("Col 2");
        for (int i = 0; i < 20; i++) {
            Vector<Object> v = new Vector<Object>();
            v.add(i % 3 == 0 ? "Hello" : "World");
            v.add("Some data in row " + (i + 1));
            v.add("Some other data in row " + (i + 1));
            data.add(v);
        }
        table = new JTable(new DefaultTableModel(data, columNames));
        Enumeration<TableColumn> en = table.getColumnModel().getColumns();
        while (en.hasMoreElements()) {
            TableColumn tc = en.nextElement();
            tc.setCellRenderer(new MyTableCellRenderer());
        }
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.add(new JScrollPane(table));
        f.pack();
        f.setVisible(true);

    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTable().initUI();
            }
        });
    }

}

As you want to alter entire rows, irrespective of column class, consider overriding prepareRenderer() , as discussed here . 当你想改变整个行,而不管列类,考虑重写prepareRenderer()为讨论在这里 The TableCellRenderer and prepareRenderer() approaches are contrasted here . 这里对比 TableCellRendererprepareRenderer()方法。

This seems like a very dirty way of handling it. 这似乎是处理它的一种非常脏的方式。 It'll be a much better idea if you use a gridLayout using the layoutManager for you containter (i think it must be a JFrame). 如果你使用layoutManager使用gridLayout为你包含(我认为它必须是一个JFrame),这将是一个更好的主意。 U can add individual componets (JPanels, Jbuttons, or any other JComponent) and handle their look by using the paint()/repaint() methods. 你可以添加单独的组件(JPanels,Jbuttons或任何其他JComponent)并使用paint()/ repaint()方法处理它们的外观。

EDIT 编辑

OR you can change the the getTableCellRendererComponent(....) method to set your custom background colors using nested if-else statements or switch-case according to the int rows ,int columns (that are provided as arguments). 或者,您可以根据int rows,int列(作为参数提供),使用嵌套的if-else语句或switch-case来更改getTableCellRendererComponent(....)方法以设置自定义背景颜色。

This will be much easier 这会容易得多

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM