当前位置: 首页 > 知识库问答 >
问题:

Java AbstractTableModel 2每行不同的颜色

陈晟睿
2023-03-14

我想增加我的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;
    }

});

共有3个答案

耿志义
2023-03-14

很久以前,我也有同样的问题。

在这种情况下,我使用swingX库中的JXTable而不是JTable。这个组件有一个很棒的方法:

addHighlighter(HighlighterFactory.createSimpleStriping());

祝你好运

袁建木
2023-03-14

请参阅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 );
}
空俊语
2023-03-14

使用来自SwingLabs的JXTable,SwingX库具有可以做到这一点的功能...如果您可以使用第三方库,这将是我首选的解决方案...

使用Nimbus look and feel来实现这一点。。。但这会妨碍您使用其他外观(如系统外观)

创建您自己的自定义TableCellRenler系列,根据当前行为其背景着色...这很乏味,因为您可能需要的每个单元格渲染器都需要能够执行此操作...

覆盖JTableprepareCellRenderer方法,并根据行强制设置单元格渲染器的背景。。。我不喜欢这个解决方案,因为它迫使渲染器做出可能不符合其要求的设计选择(覆盖单元格渲染器可能想要的值),并将您锁定到表的特定实现中。。。

创建一个JViewport,它能够与JTable对话并在表格下方呈现糖果剥离,但表格和渲染器需要是透明的...我已经这样做了,它...复杂...但允许我继续糖果剥离视图端口的全长(超出表格的可渲染区域)...

更新为JViewport示例

这是我不久前为一个项目实施的一个概念的一个例子(它实际上是由接口管理的,所以我可以包括JListJTextArea,但这是另一个问题)。。。

基本上,它使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