JTable的单元格渲染器 - 彩色行

时间:2013-02-25 16:31:22

标签: java swing jtable cellrenderer

我一直在四处寻找解决方案,我不能在不问自己问题的情况下从各个地方做头和尾巴如何让我的桌子做彩色行。

从我看过的每一个地方,我都需要使用一个细胞渲染器,但问题是我不知道如何将它应用到我自己的情况。

所以我有一个简单的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);

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

提前致谢。

4 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

  

我只想让每一行以绿色,黄色或红色突出显示,具体取决于单独变量的值(未在表格中显示)。

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

所以你需要将信息添加到表中。这可能是添加隐藏的第4列。然后该表仍然可以访问所需的信息。

然后,您可以使用Table Row Renderering中的建议。

答案 2 :(得分: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;
      }
}

答案 3 :(得分:0)

我刚才有同样的问题,但有点复杂,因为我已经为每列提供了几个不同的渲染器,具体取决于数据类型。

但我发现这就像一个魅力:

public class MyTable extends JTable {
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component result = super.prepareRenderer(renderer, row, column);

        if (mustBeYellow(row, column)) {
            result.setBackground(Color.yellow);
        }

        return result;
    }

    private boolean mustBeYellow(int row, int column) {
        // implement this depending on your data..
        return false;
    }
}