java AbstractTableModel 2每行不同的颜色

时间:2014-08-13 06:47:16

标签: 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;
    }

});

3 个答案:

答案 0 :(得分:3)

你可以......

使用来自SwingLabs, SwingX libraryJXTable具有可执行此操作的功能...如果您可以使用第三方库,这将是我的首选解决方案......

你可以......

使用Nimbus的外观和感觉这样做......但这使您无法使用其他外观(如系统的外观和感觉)

你可以......

创建自己的一系列自定义TableCellRenderer,根据当前行为其背景着色...这可能是您需要的每个单元格渲染器,需要能够执行此操作...... / p>

你可以......

覆盖prepareCellRenderer的{​​{1}}方法并根据行强制设置单元格渲染器的背景...我不是此解决方案的粉丝,因为它& #39;强制设计选择到渲染器上,这可能不符合它的要求(覆盖单元格渲染器可能需要的值)并锁定到表格的特定实现中...

你可以......

创建一个JTable,它能够与JViewport交谈,并在桌子下方剥离糖果,但桌子和渲染器需要透明......我已经完成了这个......很复杂......但是允许我继续把糖果剥离到视口的整个长度(超出桌子的可渲染区域)......

已更新为JTable示例

这是我之前为项目实施的一个概念示例(它实际上由JViewport管理,因此我可以包含interfaceJList,但是#39;另一个问题)......

基本上,它使JTextArea显示在JViewport下方,负责渲染实际的糖果剥离。

但&#34;为什么?&#34;你问...因为它不会影响表格或单元格渲染器。这样做的唯一要求是表和单元格渲染器都是透明的(除非必须这样)。

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

它远非完美,但展示了基本理念......

CandyStripped

好的,但为什么要这么麻烦?嗯,基本上,这种方法可以让你画出超出桌子绘制的区域......

CandyStripping

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

相反

答案 1 :(得分:2)

请参阅Camick制作的Table Row Rendering。它会解决您的问题。

您可以使用他的方法createAlternating来渲染行的颜色。

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

答案 2 :(得分:1)

很久以前,我遇到了同样的问题。

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

addHighlighter(HighlighterFactory.createSimpleStriping());
祝你好运