java - Jtable 与 Excel 一样具有条件格式

标签 java jtable conditional-formatting

JTable 是否像 Excel 一样支持 3 种颜色条件格式。 例子: enter image description here

我在谷歌上查了一下,我能找到的就是一次为符合条件的单元格分配单一颜色。我想知道是否可以只提供三种颜色,然后 Jtable 会根据单元格的值分配颜色深浅。

最佳答案

这是其中一种方法,您可以如何做到这一点。我们可以找到其他类(class) here

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.AbstractListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import static javax.swing.SwingConstants.CENTER;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

import general.VerticalTableHeaderCellRenderer;
import java.awt.Color;
import java.util.Random;
import javax.swing.table.TableCellRenderer;

//  The class of template for table's presentation of knowledge
//==============================================================================    
public class ExcelTable extends JFrame {

    public static int rowCount = 1024;
    public static int colCount = 1024;
    public static int CHLength = 100;
    public static int RWLength = 50;
    public static int DCW = 20;

//  The constructor of this class
//==============================================================================    
    public ExcelTable() {
        super("Draw cell rotate");
        setSize(400, 400);

        //The abstract model of table's presentation
        ListModel lm = new AbstractListModel() {
            String[] headers = new String[rowCount];

            @Override
            public int getSize() {
                return headers.length;
            }

            @Override
            public Object getElementAt(int index) {
                return headers[index];

            }
        };

        DefaultTableModel dtm = new DefaultTableModel(lm.getSize(), colCount);
        JTable table = new JTable(dtm) {
            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
                Component comp = super.prepareRenderer(renderer, row, col);
                Object value = getModel().getValueAt(row, col);
                setCellSelectionEnabled(true);

// Here you can write you schemes
                final Random r = new Random();
                Color c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256), r.nextInt(256));

                if (getSelectedRow() != 0) {
                    if (row % 2 == 0 && col % 2 == 1) {
                        comp.setBackground(c);
                    } else if (row % 2 == 1 && row % 2 == 1) {
                        comp.setBackground(c);
                    } else {
                        comp.setBackground(c);
                    }
                } else {
                    comp.setBackground(Color.white);
                }
                return comp;
            }
        };
        table.getTableHeader().setDefaultRenderer(new VerticalTableHeaderCellRenderer());
        for (int i = 0; i < colCount; i++) {
            table.getColumnModel().getColumn(i).setPreferredWidth(DCW);// .setTotalColumnWidth();
        }
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        table.setCellSelectionEnabled(true);

        // Create header rotation
        JList rowHeader = new JList(lm);
        // if (fieldlength)
        rowHeader.setFixedCellWidth(RWLength); //RowHeaser width
        rowHeader.setFixedCellHeight(table.getRowHeight());

        //Set render
        rowHeader.setCellRenderer(new RowRenderer(table));

        //JScrollPane
        JScrollPane pane = new JScrollPane(table);
        pane.setColumnHeader(new JViewport() {
            @Override
            public Dimension getPreferredSize() {
                Dimension d = super.getPreferredSize();
                d.height = CHLength;  // Col header Height
                return d;
            }
        });
        pane.setRowHeaderView(rowHeader);
        getContentPane().add(pane, BorderLayout.CENTER);

    }

//=========================================
    public static void main(String[] args) {
        ExcelTable jr = new ExcelTable();
        jr.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        jr.setVisible(true);
    }
}

class RowRenderer extends JLabel implements ListCellRenderer {

    public RowRenderer(JTable table) {
        JTableHeader header = table.getTableHeader();
        setOpaque(true);
        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        setHorizontalAlignment(CENTER);
        setForeground(header.getForeground());
        setBackground(header.getBackground());
        setFont(header.getFont());
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        setText((value == null) ? "" : value.toString());
        return this;
    }
}

输出: enter image description here

还有:enter image description here 或者 enter image description here

您必须在覆盖方法中实现所需的配色方案:

   @Override
    public Component prepareRenderer
    (TableCellRenderer renderer, int row, int col

        ) {
                Component comp = super.prepareRenderer(renderer, row, col);
        Object value = getModel().getValueAt(row, col);
        setCellSelectionEnabled(true);

    // Here you can write you schemes in RGB
// of course you need to describe it before mathematicaly
// and using variable `row` and `col` you will have coordinates to the cells
        final Random r = new Random();
        int R = r.nextInt(Math.round(256 / (row + 1)));
        int G = r.nextInt(Math.round(256 / (col + 1)));
        int B = r.nextInt(Math.round(256 / (row + col + 1)));
        Color c = new Color(R, G, B);

        if (getSelectedRow() != 0) {
            if (row % 2 == 0 && col % 2 == 1) {
                comp.setBackground(c);
            } else if (row % 2 == 1 && row % 2 == 1) {
                comp.setBackground(c);
            } else {
                comp.setBackground(c);
            }
        } else {
            comp.setBackground(Color.white);
        }
        return comp;
    }
};

关于java - Jtable 与 Excel 一样具有条件格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44418281/

相关文章:

excel - 当一列中的单元格与另一列中的单元格不匹配时更改它们的颜色

vba - 从条件格式确定单元格颜色的变化

java - 为什么 Java 方法 "Arrays.copyOf"在处理整数数组和处理对象数组时行为不同

java - 应用程序引擎 "hello world"不工作 (java)

java - 序列化内部类实例

java - 如何在编辑时更改 JTable 单元格文本?

java - 如何使Jtable单元格字符长度

java - Spring MVC 缺少请求属性

java - 如何将学生日间出勤存储在数据库中并在JTable中显示?

excel - 如果特定单元格值等于某些文本,则更改行或范围的背景颜色