JTable如何动态改变某一单元格的字体颜色

ytfvfhpeeq 2010-03-23 09:06:08
JTable中有产品的生产日期一例,显示产品的保质日期,如果超过保质期,将这一例的日期的字体变为红色,怎么实现。
...全文
643 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gentalguo 2010-03-25
  • 打赏
  • 举报
回复
呵呵,解决了就好。我的示例代码也给你。如果你的方法比我的好,也请你告诉我,提出你的意见,我们共同交流下。


package color.table;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class MainFrame extends JFrame {

private static final long serialVersionUID = 1L;
private List<String> colNames;
private List<List<Object>> data;

private JTable table;

private Calendar shieldCalendar;

public MainFrame() {
super();
initData();

Container c = getContentPane();
table = new JTable();
table.setModel(new MTableModel());
table.getColumnModel().getColumn(0).setCellRenderer(
new MTableCellRenderer());
table.getColumnModel().getColumn(1).setCellRenderer(
new MTableCellRenderer());
table.getColumnModel().getColumn(2).setCellRenderer(
new MTableCellRenderer());
c.add(new JScrollPane(table));

setSize(600, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);

}

private void initData() {
colNames = new ArrayList<String>();
colNames.add("ID");
colNames.add("Name");
colNames.add("Date");

data = new ArrayList<List<Object>>();
for (int i = 0; i < 20; i++) {
List<Object> record = new ArrayList<Object>();
record.add(String.valueOf(i + 1));
record.add("item" + (i + 1));
Calendar c = Calendar.getInstance();
c.set(2010, 3, i + 1);
record.add(c);

data.add(record);
}

shieldCalendar = Calendar.getInstance();
shieldCalendar.set(2010, 3, 10);
}

private class MTableModel extends DefaultTableModel {

private static final long serialVersionUID = 1L;

@Override
public int getColumnCount() {
return colNames.size();
}

@Override
public int getRowCount() {
return data.size();
}

@Override
public String getColumnName(int column) {
return colNames.get(column);
}

@Override
public Object getValueAt(int row, int column) {
return data.get(row).get(column);
}

@Override
public boolean isCellEditable(int row, int column) {
return false;
}

}

private class MTableCellRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;

@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Component c = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
if (value instanceof Calendar) {
Calendar cal = (Calendar) value;

if (cal.after(shieldCalendar)) {
setBackground(Color.red);
} else if (cal.equals(shieldCalendar)) {
setBackground(Color.blue);
} else {
setBackground(Color.green);
}

DateFormat f = DateFormat.getDateInstance(DateFormat.LONG);
String s = f.format(cal.getTime());
setText(s);

} else {
setBackground(Color.cyan);
}
return c;
}
}

public static void main(String[] args) {
new MainFrame();
}
}

ytfvfhpeeq 2010-03-25
  • 打赏
  • 举报
回复
我的这个问题解决了!!!
ytfvfhpeeq 2010-03-25
  • 打赏
  • 举报
回复
加载数据的时候进行判断!!
gentalguo 2010-03-24
  • 打赏
  • 举报
回复
那,我多问清楚一下了。
你所说的动态更改,是怎么样的动态。是说编辑的时候可以手动的选择颜色?
还是说读取数据的时候,直接根据数据的内容来判断
gentalguo 2010-03-24
  • 打赏
  • 举报
回复
例子啊,手头没有。倒是可以写一点。不过你要等哦~~~
ytfvfhpeeq 2010-03-24
  • 打赏
  • 举报
回复
楼上的高手,有没有小例子。发一下,多谢!!!!
WuBill 2010-03-23
  • 打赏
  • 举报
回复
帮顶。。。。。。
ytfvfhpeeq 2010-03-23
  • 打赏
  • 举报
回复
那你说一个,你只给我一个能改变JTable中某单元格字体的颜色的例子就行了,至于什么条件时显示什么颜色的字体,我自己会判断。
孤独剑客 2010-03-23
  • 打赏
  • 举报
回复
问题能不能具体点啊, 很多方法都能实现
你可以用一个线程去监控, 也可以通过对数据库的查询, 对条件进行匹配,
满足条件和不满足条件的不同处理
你的问题有点抽象
gentalguo 2010-03-23
  • 打赏
  • 举报
回复
给你的table重新设置一个renderer。改写其中的getTableCellRendererComponent方法。在这个方法中设置颜色。
ytfvfhpeeq 2010-03-23
  • 打赏
  • 举报
回复
怎么没高手来帮一下呀!!!!

62,630

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧