2013-02-25 55 views
1

我一直在寻找解决方案来解决这个问题,而且我无法制作头部和尾部,不知道如何让我的桌子在没有问自己的问题的情况下做彩色的行。用于JTable的单元格渲染器 - 彩色行

从我看过的每个地方我收集我需要使用单元格渲染器,但问题是我不知道如何将它应用于我自己的情况。

所以我有一个简单的JTable 3列,我只是希望每行都以绿色,黄色或红色高亮显示,具体取决于单独变量的值(表中未显示)。

它看起来应该很简单,但我不知道该怎么做。如果它帮助我的表格被定义为:

studentTableModel = new DefaultTableModel(new Object[]{"Name", "StudentNo", "Part"}, 0); 
jt_studentTable = new JTable(studentTableModel); 
jt_studentTable.getColumnModel().getColumn(2).setPreferredWidth(10); 
studentTableModel.addRow(new Object[]{"(empty)", "(empty)", "(empty)"}); 
JScrollPane jsp_tableScroller = new JScrollPane(jt_studentTable); 
jsp_tableScroller.setPreferredSize(new Dimension(200,190)); 
middleCentrePanel.add(jsp_tableScroller); 

表中的行根据组合框的选择而变化。

在此先感谢。

+1

这个【答案】(http://stackoverflow.com/questions/14563799/jtable-cellrenderer-changes-backgroundcolor-of -cells-while-running/14565614#14565614)可以帮助你做你的细胞渲染。 – Amarnath 2013-02-25 16:39:15

+0

无关:[永远不会调用component.setXXSize](http://stackoverflow.com/a/7229519/203657) – kleopatra 2013-02-25 16:58:03

+0

谢谢你链接到作品的答案 - 除了它只突出显示它正在检查的单元格。你知道我将如何去强调整行? – forcey123 2013-02-25 17:07:21

回答

7

JTable Cell Coloring

import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 

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


public class RowRendering { 

    private static Object[] columnName = {"Yes", "No"}; 
    private static Object[][] data = { 
      {"Y", "N"}, 
      {"N", "Y"}, 
      {"Y", "N"} 
    }; 


    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 

       JFrame frame = new JFrame(); 
       JTable table = new JTable(data, columnName); 
       table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer()); 
       table.getColumnModel().getColumn(1).setCellRenderer(new CustomRenderer()); 

       frame.add(new JScrollPane(table)); 
       frame.setTitle("Rendering in JTable"); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }; 

     EventQueue.invokeLater(r); 
    } 
} 


class CustomRenderer extends DefaultTableCellRenderer 
{ 
private static final long serialVersionUID = 6703872492730589499L; 

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     if(row == 0){ 
      cellComponent.setBackground(Color.YELLOW); 
     } else if (row == 1){ 
      cellComponent.setBackground(Color.GRAY); 
     } else { 
      cellComponent.setBackground(Color.CYAN); 
     } 
     return cellComponent; 
    } 
} 
+2

Got it排序,谢谢你的帮忙。 – forcey123 2013-02-25 18:12:27

1

我只想根据单独变量的值(不显示在表中)以绿色,黄色或红色高亮显示每一行。

渲染器处理表中的数据。也就是说,组件只有在拥有完成这项工作所需的所有信息时才能自行绘制。

所以不知何故,你需要将信息添加到表中。这可以通过添加隐藏的第4列完成。然后,表格仍然可以访问所需的信息。

那么也许你可以使用Table Row Renderering中的建议。

1

或许这对你的作品:

class MyCellRenderer extends DefaultTableCellRenderer { 
    String separatedVariable; 
    public MyCellRenderer(String separatedVariable) { 
     this.separatedVariable = separatedVariable; 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { 
      Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); 
      c.setBackground(Color.WHITE); 
      c.setForeground(Color.BLACK); 
       JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); 
      if (separatedVariable.equals("YOUR VALUE TO GREEN")) { 
       l.setBackground(Color.GREEN); 

       return l; 
      } else { 
        if (separatedValue.equals("YOUR VALUE TO YELLOW")) { 
          l.setBackground(Color.YELLOW); 
          return l; 
         } else if (separatedValue.equals("YOUR VALUE TO RED")) { 
          l.setBaground(Color.RED); 
          return l; 
         } 
       } 
       return c; 
     } 
} 
+0

嘿谢谢你的帮助,唯一的问题是该解决方案只会改变它正在检查的单元格的颜色 - 我正在寻找更改该行中的所有单元格。你知道如何去做这件事吗? – forcey123 2013-02-25 17:10:40

+0

你如何设置单元格渲染器? 尝试像这样设置: table.setCellRenderer(MyCellRenderer); – 2013-02-25 17:25:24