我想增加我的jtable的易读性,这里是MyTableModel.java类下面,如何使每一行与2不同的颜色显示在这张图。应该是什么具体的方法,我可以给每一行不同的颜色,以增加用户的易读性。
public class MyTableModel extends AbstractTableModel{
String [] columnNames;
Vector<Vector<Object>> data;
public DataAccessObject ObjDb = new DataAccessObject ();
public MyTableModel(String [] coln , Vector<Vector<Object>> data)
{
columnNames = coln;
this.data =data;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data.get(row).get(col);
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col <= 0) {
return true;
} else {
return true;
}
}
public void setValueAt(Object value, int row, int col) {
data.get(row).set(col, value);
fireTableCellUpdated(row, col);
}
private class RowListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent event) {
if (event.getValueIsAdjusting()) {
return;
}
// output.append("ROW SELECTION EVENT. ");
// outputSelection();
}
}
private class ColumnListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent event) {
if (event.getValueIsAdjusting()) {
return;
}
// output.append("COLUMN SELECTION EVENT. ");
// outputSelection();
}
}
}
Netbeans用变量名自动创建了我的jtable,我设置的变量名是mytable,然后我在下面定义prepareRenderer时遇到问题,我是否错过了这里的步骤?我想用不同的颜色制作每一行,下面是我的示例代码。
mytable.prepareRenderer(TableCellRenderer renderer, int row, int column)
{
Component c = super.prepareRenderer(renderer, row, column);
// Alternate row color
if (!isRowSelected(row))
c.setBackground(row % 2 == 0 ? getBackground() : Color.LIGHT_GRAY);
return c;
}
};
我也用过这个,但是这个设置了5列,我有7列,剩下的两列在最后没有
着色,当我单击白色行时,文本颜色会消失。
mytable.setDefaultRenderer(Object.class, new TableCellRenderer() {
private DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean
isSelected, boolean hasFocus, int row, int column) {
Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
System.out.println(column);
if (row % 2 == 0) {
c.setBackground(Color.WHITE);
} else {
c.setBackground(Color.LIGHT_GRAY);
}
return c;
}
});
很久以前,我也有同样的问题。
在这种情况下,我使用swingX库中的JXTable而不是JTable。这个组件有一个很棒的方法:
addHighlighter(HighlighterFactory.createSimpleStriping());
祝你好运
请参阅Camick制作的此表行渲染。它会解决您的问题。
您可以使用他的方法create备用
来渲染行的颜色。
private JComponent createAlternating(DefaultTableModel model)
{
JTable table = new JTable( model )
{
public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
{
Component c = super.prepareRenderer(renderer, row, column);
// Alternate row color
if (!isRowSelected(row))
c.setBackground(row % 2 == 0 ? getBackground() : Color.LIGHT_GRAY);
return c;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.changeSelection(0, 0, false, false);
return new JScrollPane( table );
}
使用来自SwingLabs的JXTable
,SwingX库具有可以做到这一点的功能...如果您可以使用第三方库,这将是我首选的解决方案...
使用Nimbus look and feel来实现这一点。。。但这会妨碍您使用其他外观(如系统外观)
创建您自己的自定义TableCellRenler
系列,根据当前行为其背景着色...这很乏味,因为您可能需要的每个单元格渲染器都需要能够执行此操作...
覆盖JTable
的prepareCellRenderer
方法,并根据行强制设置单元格渲染器的背景。。。我不喜欢这个解决方案,因为它迫使渲染器做出可能不符合其要求的设计选择(覆盖单元格渲染器可能想要的值),并将您锁定到表的特定实现中。。。
创建一个JViewport
,它能够与JTable
对话并在表格下方呈现糖果剥离,但表格和渲染器需要是透明的...我已经这样做了,它...复杂...但允许我继续糖果剥离视图端口的全长(超出表格的可渲染区域)...
更新为JViewport
示例
这是我不久前为一个项目实施的一个概念的一个例子(它实际上是由接口
管理的,所以我可以包括JList
和JTextArea
,但这是另一个问题)。。。
基本上,它使JViewport
出现在JTable
下方,负责渲染实际的糖果剥离。
但是“为什么?”你问。。。因为它不会影响表或单元格渲染器。这样做的唯一要求是表和单元格渲染器都是透明的(除非它们必须是透明的)。
这意味着,你不需要在渲染器中放入糖果剥离逻辑,这意味着你不需要覆盖你创建的每个表的prepareRenderer
,并破坏单元格渲染器的要求。。。
这远不是完美的,但它展示了基本理念。。。
好吧,但为什么要麻烦呢?基本上,这种方法可以让你在桌子画的区域之外画画。。。
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class CandyStrippedTable {
public static void main(String[] args) {
new CandyStrippedTable();
}
public CandyStrippedTable() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
Object[] columns = new Object[10];
for (int col = 0; col < columns.length; col++) {
columns[col] = (char) (65 + col);
}
Object[][] data = new Object[10][10];
for (int row = 0; row < data.length; row++) {
for (int col = 0; col < data[row].length; col++) {
data[row][col] = row + "x" + col;
}
}
DefaultTableModel model = new DefaultTableModel(data, columns);
JTable table = new JTable(model);
table.setDefaultRenderer(Object.class, new 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);
setOpaque(isSelected);
return this;
}
});
table.setFillsViewportHeight(true);
table.setOpaque(false);
JScrollPane sp = new JScrollPane();
sp.setViewport(new CandyStrippedViewPort(new Color(255, 0, 0, 128)));
sp.setViewportView(table);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(sp);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class CandyStrippedViewPort extends JViewport {
private Color candyStrippedColor;
public CandyStrippedViewPort(Color color) {
candyStrippedColor = color;
}
public Color getCandyStrippedColor() {
return candyStrippedColor;
}
public void setCandyStrippedColor(Color candyStrippedColor) {
this.candyStrippedColor = candyStrippedColor;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(getCandyStrippedColor());
Component view = getView();
if (view instanceof JTable) {
JTable table = (JTable) view;
Rectangle viewRect = getViewRect();
int y = 0;
int row = 0;
if (table.getRowCount() > 0) {
row = table.rowAtPoint(viewRect.getLocation());
while (row < table.getRowCount()) {
int rowHeight = table.getRowHeight(row);
Rectangle cellRect = table.getCellRect(row, 0, true);
if (row % 2 == 0) {
g2d.fillRect(0, cellRect.y - viewRect.y, getWidth(), cellRect.height);
}
y = cellRect.y + cellRect.height;
row++;
}
}
int rowHeight = table.getRowHeight();
while (y < getHeight()) {
if (row % 2 == 0) {
g2d.fillRect(0, y, getWidth(), rowHeight);
}
row++;
y += rowHeight;
}
}
g2d.dispose();
}
}
}
格式化单元格渲染器中的数字
你可以从这样的开始。。。
obj.table.setDefaultRenderer(Double.class,
new DefaultTableCellRenderer() {
@Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Number) {
value = NumberFormat.getNumberInstance().format(value);
}
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setOpaque(isSelected);
return this;
}
});
如果出于某种原因,默认格式不合适,您可以执行以下操作。。。
obj.table.setDefaultRenderer(Double.class,
new DefaultTableCellRenderer() {
@Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Number) {
NumberFormat ni = NumberFormat.getNumberInstance();
ni.setMaximumFractionDigits(2)
value = ni.format(value);
}
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setOpaque(isSelected);
return this;
}
});
相反
问题内容: 如果折线图中的数据点高于某个特定值,是否可以为该数据点设置其他颜色? 问题答案: 对于chartjs 2.0,请参见以下答案。 下面是原始答案。 关于ChartJS的好问题。我一直想做类似的事情。即动态地将点颜色更改为其他颜色。您在下面尝试过此吗?我只是尝试过,它对我有用。 试试这个: 或尝试以下方法: 甚至这个: 然后执行以下操作: 我想你可能会喜欢 仍然尝试一下。
我在一个项目中使用ChartJS,我需要为条形图中的每个条形图使用不同的颜色。 下面是条形图数据集的示例: 有没有什么方法可以把每个酒吧涂成不同的颜色?
我在做某种“游戏分数追踪器”。以下是该应用程序当前的工作方式: 用户通过在EditText中键入名称,然后单击“确定”按钮来添加播放机。 用户添加完新玩家后,按“开始游戏”按钮,新活动将打开。 玩家将被添加到可参与的额外活动中,并被带到下一个活动中。 在下一个活动中,用户有一个spinner、EditText和+、-按钮。当用户从旋转器中选择某个玩家,输入某个分数,然后输入+或-后,将出现一个新的
问题内容: 我是iOS开发的新手,但我陷入了困境。我正在尝试使用每个面都有不同颜色的SceneKit渲染立方体。 到目前为止,这是我得到的: 但是我希望每张脸都有不同的颜色。我怎么做? 问题答案: 该盒子由六个不同的元素组成(每侧一个)。您可能还已经注意到,几何对象具有 第一种 材料的一个属性,但也具有一系列材料的属性。 具有多个元素和多种材质的对象将选择每个元素的材质增量(并环绕)。 例如4种元
我想可视化位图文件中不同颜色的数量。 我的数据表看起来像: 我想通过使用gnu绘图直方图样式,用自己的颜色绘制每个颜色条。 我只是通过使用“lc变量”来尝试一些东西,但它不起作用。:-( 现在我的GNUPLOT脚本: 我收到了以下错误消息: 谁能给我一个提示或正确的命令? 向罗伯特问好
我用openlayers 3在地图中上传了一个geojson文件。geojson文件是一个FeatureCollection,具有LineString类型的5个功能。如何为每个功能添加不同的颜色以区分路径?如果我将颜色添加到geojson文件的样式中,则不会读取该文件,如果我将颜色添加到笔划中,则所有功能都以单一颜色着色。 下面我添加代码。 谢谢 文件GEOJSON: "type":"Featur