繁体   English   中英

jtable的着色单元格引用数字

[英]Coloring cell of jtable referring to a number

我在女巫中开发一个应用程序,我有一个桌子,桌子上有一个数字,劣等数字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)
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,并且没有特定于renderer类的内容。

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

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

    setBackground(Color.RED);

    return this;
}

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

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

    c.setBackground(Color.RED);

    return c;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM