如何使用 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();
}
});
*/
}
}
我用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();
}
});
*/
}
}