我用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;
}
答案 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();
}
});
*/
}
}