如何使用 DefaultTableCellRenderer 在 JTable 中隐藏相同的值

How Can I hide same value in the JTable by using DefaultTableCellRenderer

我用Java做了一个时间表,但是我一个问题也解决不了

当某些单元格在第一个检测到的单元格中具有相同的值时,我想将前景色更改为与背景色相同或隐藏一个值。

像这样...

这是我做的...

(抱歉韩语...)

所以,我想使用 DefaultTableCellRenderer,但是我找不到一个很好的例子。

而且,我不知道 DefaultTableCellRenderer 是如何工作的。找不到任何解释...

所以,我想请教一下这个问题。

这是我的代码:

public class subject_table_renderer extends DefaultTableCellRenderer
{ 
private Object subject_name = "";
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean   isSelected, boolean hasFocus, int row, int column) 
{ 
    Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    if (! isSelected) 
    {
        if(value.equals("")){
                cell.setBackground(Color.WHITE);
        }
        else{
            String[] temp = MainFrame.find_list((String)value, MainFrame.subject);
            //take a subject_list for decide background color

            if(!value.equals(subject_name)){
                subject_name = value;
                cell.setBackground(get_rand_color(cell, Integer.parseInt(temp[6])));
            }
            else{   
                cell.setBackground(get_rand_color(cell, Integer.parseInt(temp[6])));
                cell.setForeground(get_rand_color(cell, Integer.parseInt(temp[6])));
            }
        }
    }
    return cell;
} 

And, I don't know how DefaultTableCellRenderer works. Can't find any explains about that...

也许可以从 Concepts: Editors and Renderers 上的 Swing 教程开始。

您不能使用实例变量来跟踪先前的值,因为您不能保证行将始终按顺序呈现。例如,如果选择第 1 行,然后单击第 10 行,则只会重绘第 1 行和第 10 行。

所以解决方案是将渲染中的先前值与类似的代码进行比较:

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

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        setLayout( new BorderLayout() );

        JTable table = new JTable(10, 1);
        table.setValueAt("one", 0, 0);
        table.setValueAt("one", 1, 0);
        table.setValueAt("two", 2, 0);
        table.setValueAt("two", 3, 0);
        table.setValueAt("two", 4, 0);
        table.setValueAt("three", 5, 0);
        add( new JScrollPane( table ) );

        table.getColumnModel().getColumn(0).setCellRenderer( new DuplicateRenderer() );
    }

    /*
    **  Color the focused cell
    */
    class DuplicateRenderer extends DefaultTableCellRenderer
    {
        @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 (row > 0 && value != null)
            {
                Object previous = table.getValueAt(row - 1, column);

                if (value.equals(previous))
                {
                    setText("");
                }
            }

            return this;
        }
    }


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

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