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

时间:2016-06-06 15:49:20

标签: java swing jtable tablecellrenderer

我用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;
} 

1 个答案:

答案 0 :(得分:1)

  

而且,我不知道DefaultTableCellRenderer的工作原理。无法找到任何解释......

也许从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.setDefaultRenderer(Object.class, 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();
            }
        });
*/
    }
}