1

我一直在寻找解决这个问题的方法,如果不问我自己的问题,我就无法从各个地方找出如何让我的桌子做彩色行的方法。

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

所以我有一个包含 3 列的简单 JTable,我只是希望每一行根据单独变量的值(未显示在表中)以绿色、黄色或红色突出显示。

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

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

4 回答 4

8

JTable 单元格着色

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;
    }
}
于 2013-02-25T17:40:04.383 回答
1

我只是希望每一行根据单独变量的值(未显示在表中)以绿色、黄色或红色突出显示。

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

因此,您需要以某种方式将信息添加到表中。这可以通过添加隐藏的第四列来完成。然后该表仍然可以访问所需的信息。

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

于 2013-02-25T16:35:37.903 回答
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;
      }
}
于 2013-02-25T16:48:41.207 回答
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;
    }
}
于 2018-05-11T13:28:01.033 回答