Java jTable颜色行在已定义的单元格更改中

时间:2019-04-19 18:17:26

标签: java swing jtable renderer

您好,我在下面的代码中没有发现不正确之处。它会很好地填充表和标题。但是,当我将第1行,第1列更改为 test 并单击时,它不会像我期望的那样为行着色。然后,单击我所单击的按钮,该按钮将变为绿色,然后我单击该表的任何位置都将变为绿色。

该列不会从 1(公司)更改,因为这将是将进行更改的默认列。 是此处唯一的动态数字。

要测试的流程:

  • 双击IBM。
  • 输入测试
  • 单击任何其他单元格以保存该单元格值。
  • 该行保持不变(第1行)。
  • 再次单击测试单元。
  • 所有行将变为绿色。

预期流量:

  • 双击IBM。
  • 输入测试
  • 单击任何其他单元格以保存该单元格值。
  • 已更改为测试的单元格更改了该行绿色
  • 在单元格(3,3)中单击 Shares
  • 双击并将 4000 更改为 1000
  • 单击任何其他单元格以保存该单元格值。
  • 已更改为 1000 的单元格更改了该行红色

填充表和标题:

enter image description here

点击并将第1行第1列值更改为 test

enter image description here

在编辑后在该单元格上单击另一个单元格

enter image description here

现在,单击任何其他单元格(注意测试行不是应该的绿色):

enter image description here

现在单击我编辑以测试的单元格:

enter image description here

您会看到,上面只是为我单击的每一行着色,无论我说的是什么逻辑

if(“ test” .equals(type)){...

java代码:

@SuppressWarnings("serial")
public class TableRowRenderingTip extends JPanel {
    public TableRowRenderingTip() {
        Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
        Object[][] data =
        {
            {"Buy", "IBM", new Integer(1000), new Double(80.5), Boolean.TRUE},
            {"Sell", "Dell", new Integer(2000), new Double(6.25), Boolean.FALSE},
            {"Short Sell", "Apple", new Integer(3000), new Double(7.35), Boolean.TRUE},
            {"Buy", "MicroSoft", new Integer(4000), new Double(27.50), Boolean.FALSE},
            {"Short Sell", "Cisco", new Integer(5000), new Double(20), Boolean.TRUE}
        };

        DefaultTableModel model = new DefaultTableModel(data, columnNames) {
            @SuppressWarnings({ "unchecked", "rawtypes" })
            public Class getColumnClass(int column) {
                return getValueAt(1, column).getClass();
            }
        };

        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Border", createBorder(model));
        add(tabbedPane);
    }

    private JComponent createBorder(DefaultTableModel model) {
        JTable table = new JTable(model) {
            private Border outside      = new MatteBorder(1, 0, 1, 0, Color.RED);
            private Border _outside     = new MatteBorder(1, 0, 1, 0, Color.GREEN);
            private Border inside       = new EmptyBorder(0, 1, 0, 1);
            private Border highlight    = new CompoundBorder(outside, inside);
            private Border _highlight   = new CompoundBorder(_outside, inside);

            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                JComponent jc = (JComponent)c;
                String type = (String)getModel().getValueAt(convertRowIndexToModel(row), 1);

                if (isRowSelected(row)) {           
                    if ("test".equals(type)) {
                        jc.setBorder( _highlight ); // Green color
                        jc.setBackground(Color.GREEN);
                    } else {
                        jc.setBorder( highlight ); //Red color
                    }
                }

                return c;
            }
        };

        //table.setPreferredScrollableViewportSize(table.getPreferredSize());
        //table.changeSelection(0, 0, false, false);        
        return new JScrollPane( table );
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI()
    {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("Table Row Rendering");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableRowRenderingTip() );
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

不用说,自从我从事这个工作已经几个小时了,直到想找出可能是什么问题的时候,我才有点沮丧。

我确定这将是一件简单的事情……

1 个答案:

答案 0 :(得分:1)

如果测试条件不正确,您将忘记设置边框并突出显示为默认值。例如

if (isRowSelected(row)) {
    if ("test".equals(type)) {
        jc.setBorder(_highlight); // Green color
        jc.setBackground(Color.GREEN);
    } else {
        jc.setBorder(highlight); // Red color
    }
} else {
    jc.setBorder(null);
    jc.setBackground(null);
}