Java 更改JTable行的颜色
我有两个JTable tblOrderInfo和tblDetailInfo我想在tblDetailInfo行的基础上给tblOrderInfo行上色,我做了很多研究,找到了文章和许多其他文章,但它适用于基于静态值检查的着色,不适用于我对JTable的动态过滤 我用Rob的方法尝试了一个函数,但它不起作用Java 更改JTable行的颜色,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我有两个JTable tblOrderInfo和tblDetailInfo我想在tblDetailInfo行的基础上给tblOrderInfo行上色,我做了很多研究,找到了文章和许多其他文章,但它适用于基于静态值检查的着色,不适用于我对JTable的动态过滤 我用Rob的方法尝试了一个函数,但它不起作用 private Component createColoring(DefaultTableModel model) { tblOrderInfo = new JTable
private Component createColoring(DefaultTableModel model)
{
tblOrderInfo = new JTable( model )
{
public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
{
Component c = super.prepareRenderer(renderer, row, column);
// Color row based on a cell value
if (!isRowSelected(row))
{
c.setBackground(getBackground());
int modelRow = convertRowIndexToModel(row);
String type = (String)getModel().getValueAt(modelRow, 0);
Object orderId="";
Object design="";
Object sno="";
for(int r=0;r< tblDetailInfo.getRowCount();r++){
orderId= tblDetailInfo.getValueAt(r, util.getColumnIndex( tblDetailInfo, "orderId"));
design= tblDetailInfo.getValueAt(r, util.getColumnIndex( tblDetailInfo, "design"));
sno= tblDetailInfo.getValueAt(r, util.getColumnIndex( tblDetailInfo, "sno"));
for(int o=0;o< tblOrderInfo.getRowCount();o++){
if(( tblOrderInfo.getValueAt(o, util.getColumnIndex( tblOrderInfo, "orderId")).equals(orderId))
&& ( tblOrderInfo.getValueAt(o, util.getColumnIndex( tblOrderInfo, "design")).equals(design))
&& ( tblOrderInfo.getValueAt(o, util.getColumnIndex(tblOrderInfo, "sno")).equals(sno))
){
c.setForeground(Color.RED);
}
}
}
}
return c;
}
};
tblOrderInfo.setPreferredScrollableViewportSize(tblOrderInfo.getPreferredSize());
tblOrderInfo.changeSelection(0, 0, false, false);
tblOrderInfo.setAutoCreateRowSorter(true);
return tblOrderInfo;
}
每个单元格都会调用prepareRenderer()方法,因此您的基本代码结构是错误的。循环抛出一个表中的所有行,然后抛出第二个表中的所有行。因此,如果在任何地方找到匹配项,则该行将着色,并且表中的每一行都将相同
我想在tblDetailInfo行的基础上为tblOrderInfo行着色
我认为您的基本伪代码应该是:
foreach row in the detail table
if ((detail.orderId.equals(order.orderid)
and (detail.design.equals(order.design)
and (detail.sno.equals(order.sno))
{
c.setForeground( Color.RED);
break;
}
下面的课程适合我
class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
AssignOrderToWax ass =null;
public MyTableCellRenderer( AssignOrderToWax ass){
this.ass=ass;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setForeground(Color.BLACK);
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Object orderId="";
Object design="";
Object sno="";
for(int r=0;r<ass.tblDetailInfo.getRowCount();r++){
orderId=ass.tblDetailInfo.getValueAt(r, ass.util.getColumnIndex(ass.tblDetailInfo, "orderId"));
design=ass.tblDetailInfo.getValueAt(r, ass.util.getColumnIndex(ass.tblDetailInfo, "design"));
sno=ass.tblDetailInfo.getValueAt(r, ass.util.getColumnIndex(ass.tblDetailInfo, "sno"));
if((ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "orderId")).equals(orderId))
&& (ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "design")).equals(design))
&& (ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "sno")).equals(sno))
){
setForeground(Color.RED);
break ;
}
}return this;
}
}
类MyTableCellRenderer扩展了DefaultTableCellRenderer实现了TableCellRenderer{
AssignOrderToWax ass=null;
公共MyTableCellRenderer(AssignOrderToWax ass){
这个。ass=ass;
}
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
设置前景(颜色为黑色);
getTableCellRenderComponent(表、值、isSelected、hasFocus、行、列);
对象orderId=“”;
对象设计=”;
对象sno=“”;
对于(int r=0;rTanks@Camickr我承认我的错误。我的算法是错误的,中断丢失了。谢谢你指出我的错误。亲爱的@Camickr再次使用中断逻辑进行了测试,但它不起作用,订单表的所有行都是彩色的。我建议你需要做更多的更改,而不仅仅是添加中断。我建议你不需要2个for循环。我无法编写为您编写代码。您的逻辑在某个地方出错。除非您能发布正确的
SSCCE
,否则我无法再提出建议,因为我不知道您是否正确实施了我的建议,或者我是否理解您的确切要求。
class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
AssignOrderToWax ass =null;
public MyTableCellRenderer( AssignOrderToWax ass){
this.ass=ass;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setForeground(Color.BLACK);
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Object orderId="";
Object design="";
Object sno="";
for(int r=0;r<ass.tblDetailInfo.getRowCount();r++){
orderId=ass.tblDetailInfo.getValueAt(r, ass.util.getColumnIndex(ass.tblDetailInfo, "orderId"));
design=ass.tblDetailInfo.getValueAt(r, ass.util.getColumnIndex(ass.tblDetailInfo, "design"));
sno=ass.tblDetailInfo.getValueAt(r, ass.util.getColumnIndex(ass.tblDetailInfo, "sno"));
if((ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "orderId")).equals(orderId))
&& (ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "design")).equals(design))
&& (ass.tblOrderInfo.getValueAt(row, ass.util.getColumnIndex(ass.tblOrderInfo, "sno")).equals(sno))
){
setForeground(Color.RED);
break ;
}
}return this;
}
}
Enumeration<TableColumn> en = tblOrderInfo.getColumnModel().getColumns();
while (en.hasMoreElements()) {
tc = en.nextElement();
tc.setCellRenderer(new MyTableCellRenderer(this));
}