首页 > 解决方案 > jtable的着色单元格引用一个数字

问题描述

我正在女巫中开发一个应用程序我有一个充满数字的表格,低于 10 的数字用绿色着色,其他数字用 LIGHT_GRAY 着色为此我使用了 TABLECELLRENDERER 但它一直告诉我有错误,我不知道是什么正是这个错误,所以如果你不能,我会寻求你的帮助,另一件事我想把它应用到所有表格我上面为一列写的代码我如何在所有列上转换它谢谢

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class RenduCellule extends DefaultTableCellRenderer {


    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        Component c = getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (column == 2) {
       float val = Float.parseFloat(table.getValueAt(row,column)+"");
            Color color = null;
            if (val < 10)
                color = Color.green;
            else
                color = Color.LIGHT_GRAY;

            c.setBackground(color);
        } else
            c.setBackground(Color.pink);
        return c;

    }
}

我主要写了这个

jTable.setDefaultRenderer(Object.class, new RenduCellule());

这是错误

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at sagem02.RenduCellule.getTableCellRendererComponent(RenduCellule.java:17)
at javax.swing.JTable.prepareRenderer(JTable.java:5723)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2016)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at javax.swing.JComponent.paintComponent(JComponent.java:780)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JViewport.paint(JViewport.java:728)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
at javax.swing.JComponent.paint(JComponent.java:1042)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
at java.awt.Container.paint(Container.java:1975)
at java.awt.Window.paint(Window.java:3912)
at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

标签: javaswingnullpointerexceptionjtabletablecellrenderer

解决方案


private static final TableCellRenderer RENDERER = new DefaultTableCellRenderer();

没有必要。

Component c = RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

应该:

Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

也就是说,您需要先调用渲染器的默认逻辑,然后再调用您的自定义渲染代码。

还,

Object result = table.getModel().getValueAt(row, column);

应该:

Object result = table.getValueAt(row, column);

因为行/列是相对于视图(表)而不是模型。如果您的表是每次排序或过滤的,则表的行/列值将不会直接与模型匹配。

编辑:

super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
 Component c = getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

为什么有两行代码?我的建议只有一行代码。

覆盖一个方法是基本的 Java 并且不是特定于渲染器类的。

通常要覆盖一个方法,您可以执行以下操作:

public Component getTableCellRendererComponent(...)
{
    super.getTableCellRendererComponent(...);

    setBackground(Color.RED);

    return this;
}

或者因为该方法返回执行渲染的组件,您可以执行以下操作:

public Component getTableCellRendererComponent(...)
{
    Component c = super.getTableCellRendererComponent(...);

    c.setBackground(Color.RED);

    return c;
}

如果您不知道如何使用某个方法,则使用该方法名称搜索论坛以查找论坛中的其他示例。利用论坛和网络上的所有信息。


推荐阅读