java AbstractTableModel 2 每行有不同的颜色

标签 java swing colors jtable abstracttablemodel

我想增加我的jtable的可读性,下面是MyTableModel.java类,如何使每一行有2种不同的颜色shown in this picture 。我可以为每一行赋予不同的颜色以增加用户的可读性的具体方法应该是什么。

      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;
    }

});

最佳答案

你可以...

使用SwingLabs, SwingX library中的JXTable它具有可以执行此操作的功能...如果您可以使用第 3 方库,这将是我的首选解决方案...

你可以...

使用 Nimbus 外观来执行此操作...但这会阻止您使用其他外观(例如系统外观)

你可以...

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

你可以...

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

你可以...

创建一个JViewport,它能够与JTable通信并在 table 下面渲染糖果剥离,但 table 和渲染器需要是透明的......我已经完成了这个,它......很复杂......但允许我继续糖果剥离 View 端口的整个长度(超出表格的可渲染区域)......

已更新 JViewport 示例

这是我不久前为一个项目实现的概念示例(它实际上由接口(interface)管理,因此我可以包含JListJTextArea 也是如此,但那是另一个问题)...

基本上,它使出现在 JTable 下方的 JViewport 负责渲染实际的糖果剥离。

但是“为什么?”您问...因为它不会影响表格或单元格渲染器。唯一的要求是表格和单元格渲染器都是透明的(除非必须如此)。

这意味着,您不需要在渲染器中放置糖果剥离逻辑,这意味着您不需要覆盖您创建的每个表的 prepareRenderer 并破坏单元格渲染器的要求...

它远非完美,但展示了基本思想......

CandyStripped

好吧,但是为什么要这么麻烦呢?好吧,基本上,这种方法允许您在 table 绘制的区域之外进行绘制...

CandyStripping

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; 
        } 
    });

相反

关于java AbstractTableModel 2 每行有不同的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25279727/

相关文章:

java - 如何修复android studio中的 'Incovertible types'?

java - java中URL截图的任何方法

java - 如何在 JInternalFrame 的 ScrollPane 中动态设置 JTable 的宽度

android - 十六进制的颜色名称

javascript - 如何生成颜色以按颜色对元素进行分组?

java - 包装 jframe

java - 一旦计数器达到某个值,就递增数组

java - 将 BufferedImage 的像素设置为透明

python - 在运行时单击时如何更改按钮的颜色?

Java toString() 方法不适用于我的类