引用数字的 jtable 的着色单元格
Coloring cell of jtable referring to a number
我正在 开发一个应用程序 我有一个 table 充满了数字 10 以下的数字用绿色着色,其他用 LIGHT_GRAY 着色
为此我使用了 TABLECELLRENDERER 但它一直告诉我有错误,我无法找出到底是什么错误所以如果你不能,我正在寻求你的帮助
还有一件事我想将它应用到所有 table 我上面为一列写的代码我如何在所有列上转换它
谢谢
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.run(RepaintManager.java:842)
at javax.swing.RepaintManager.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.access00(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.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:709)
at java.awt.EventQueue.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);
因为 row/column 是相对于视图 (table) 而不是模型。如果您的 table 每次都经过排序或过滤,则 table 的 row/column 值将不会直接与模型匹配。
编辑:
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Component c = getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
为什么你有两行代码?我的建议只有一行代码。
重写方法是基本的 Java 并且与渲染器无关 class。
通常要重写一个方法,您可以这样做:
public Component getTableCellRendererComponent(...)
{
super.getTableCellRendererComponent(...);
setBackground(Color.RED);
return this;
}
或者因为方法 returns 进行渲染的组件你可以这样做:
public Component getTableCellRendererComponent(...)
{
Component c = super.getTableCellRendererComponent(...);
c.setBackground(Color.RED);
return c;
}
如果您不知道如何使用方法,请使用方法名称搜索论坛以在论坛中查找其他示例。充分利用论坛和网络上的所有信息。
我正在 开发一个应用程序 我有一个 table 充满了数字 10 以下的数字用绿色着色,其他用 LIGHT_GRAY 着色 为此我使用了 TABLECELLRENDERER 但它一直告诉我有错误,我无法找出到底是什么错误所以如果你不能,我正在寻求你的帮助 还有一件事我想将它应用到所有 table 我上面为一列写的代码我如何在所有列上转换它 谢谢
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.run(RepaintManager.java:842)
at javax.swing.RepaintManager.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.access00(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.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:709)
at java.awt.EventQueue.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);
因为 row/column 是相对于视图 (table) 而不是模型。如果您的 table 每次都经过排序或过滤,则 table 的 row/column 值将不会直接与模型匹配。
编辑:
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Component c = getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
为什么你有两行代码?我的建议只有一行代码。
重写方法是基本的 Java 并且与渲染器无关 class。
通常要重写一个方法,您可以这样做:
public Component getTableCellRendererComponent(...)
{
super.getTableCellRendererComponent(...);
setBackground(Color.RED);
return this;
}
或者因为方法 returns 进行渲染的组件你可以这样做:
public Component getTableCellRendererComponent(...)
{
Component c = super.getTableCellRendererComponent(...);
c.setBackground(Color.RED);
return c;
}
如果您不知道如何使用方法,请使用方法名称搜索论坛以在论坛中查找其他示例。充分利用论坛和网络上的所有信息。