java - 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)
解决方案
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;
}
如果您不知道如何使用某个方法,则使用该方法名称搜索论坛以查找论坛中的其他示例。利用论坛和网络上的所有信息。
推荐阅读
- sql - 如何在 where 语句中使用年份来过滤时差?
- sql-server - 如果 SQL Server 代理作业失败,则发送 Whatsapp 通知
- solr - Solr 日期范围过滤
- python - 值错误:时间数据“2019-03-19T07:01:02Z”与格式“%Y-%m-%dT%H:%M:%S.%fZ”不匹配
- android-studio - 在 Android Studio 中更改默认捕获代码
- python - 用从变量中随机选择的整数替换整数
- tensorflow - 如何将张量流模型转换为 keras 模型?.pb 文件到 .hdf5?
- excel - 如何在命名范围上使用循环
- php - Laravel Eloquent 模型查询与自定义选择/加入/订单
- angular - 如何使用 FormControl 在 Angular 7 中将索引值设置为 Form