【问题标题】:removing jtable grid (cell border) completely完全删除 jtable 网格(单元格边框)
【发布时间】:2012-05-03 17:30:14
【问题描述】:

如何完全去除摆动 JTable 中单元格周围的边框,使单元格之间没有间隙? 这是我尝试过的:

table.setShowGrid(false);
table.setShowVerticalLines(false);
table.setShowHorizontalLines(false);

并编写单元格渲染器并使用:

setBorder(BorderFactory.createEmptyBorder(0,0,0,0));

对于每个单独的单元格。

但结果是单元格之间的线条被删除,但它们之间留下了 1 个像素的间隙。

【问题讨论】:

    标签: java swing jtable border cell


    【解决方案1】:

    如果您的列模型不是自动生成的(没有数据绑定),您可以在 JTable 中使用这些方法来删除网格。

     setShowGrid(false);
     setRowMargin(0);
     setShowVerticalLines(false);
     setShowHorizontalLines(false);
    

    但是,如果您使用数据绑定创建列模型,那么您就有麻烦了。也就是说,即使您调用这些方法,它们仍然会在每个列边距中绘制白色 1 像素的间隙。

    您可以使用自定义 DefaultTableColumnModel 删除该列边距。

     private class CustomDefaultTableColumnModel extends DefaultTableColumnModel{
    
     @Override
     public void setColumnMargin(int newMargin) {
        //Always set ColumnMargin to zero.
        //Because after the column data binding its internally set one as ColumnMargin.
       //That course to paint white color grid.
       //To stop we override the setColumnMargin and pass zero to ColumnMargin.
      super.setColumnMargin(0);
      }
    }
    

    然后您可以将自定义表格列模型添加到表格中。

     setColumnModel(new CustomDefaultTableColumnModel());
    

    【讨论】:

    • 这是避免在所选行中出现讨厌的白色 1 像素网格的最佳解决方案。也许我会建议覆盖 getColumnMargin 以始终返回 0,而不是覆盖 setColumnMargin 方法,但它非常接近。
    【解决方案2】:

    并编写单元格渲染器并使用:

    一切都取决于渲染器返回的内容,但没有渲染器对我有用

    • setIntercellSpacing()

    • setShowGrid()

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.DefaultTableModel;
    
    public class TableExample {
    
        public TableExample() {
            Object[][] data1 = new Object[50][5];
            for (int i = 0; i < data1.length; i++) {
                data1[i][0] = "Company # " + (i + 1);
                for (int j = 1; j < data1[i].length; j++) {
                    data1[i][j] = "" + (i + 1) + ", " + j;
                }
            }
            String[] headers = {"Col 1", "Col 2", "Col 3", "Col 4", "Col 5"};
            DefaultTableModel model1 = new DefaultTableModel(data1, headers);
            final JTable jTable3 = new TableBackroundPaint0(data1, headers);
            //final JTable jTable3 = new JTable(data1, headers);
            jTable3.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            jTable3.setModel(model1);
            final JScrollPane sp3 = new JScrollPane();
            sp3.setViewportView(jTable3);
            jTable3.setIntercellSpacing(new Dimension(0, 0));
            jTable3.setShowGrid(false);
            //jTable3.setPreferredScrollableViewportSize(jTable3.getPreferredSize());
            JFrame frame = new JFrame("tableSelection");
            frame.add(sp3);
            frame.setSize(new Dimension(600, 200));
            //frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    TableExample te = new TableExample();
                }
            });
        }
    }
    
    class TableBackroundPaint0 extends JTable {
    
        private static final long serialVersionUID = 1L;
    
        TableBackroundPaint0(Object[][] data, Object[] head) {
            super(data, head);
            setOpaque(false);
            ((JComponent) getDefaultRenderer(Object.class)).setOpaque(false);
        }
    
        @Override
        public void paintComponent(Graphics g) {
            Color background = new Color(168, 210, 241);
            Color controlColor = new Color(230, 240, 230);
            int width = getWidth();
            int height = getHeight();
            Graphics2D g2 = (Graphics2D) g;
            Paint oldPaint = g2.getPaint();
            g2.setPaint(new GradientPaint(0, 0, background, width, 0, controlColor));
            g2.fillRect(0, 0, width, height);
            g2.setPaint(oldPaint);
            for (int row : getSelectedRows()) {
                Rectangle start = getCellRect(row, 0, true);
                Rectangle end = getCellRect(row, getColumnCount() - 1, true);
                g2.setPaint(new GradientPaint(start.x, 0, controlColor, (int) ((end.x + end.width - start.x) * 1.25), 0, Color.orange));
                g2.fillRect(start.x, start.y, end.x + end.width - start.x, start.height);
            }
            super.paintComponent(g);
        }
    }
    

    【讨论】:

    • 注意,你必须调用setIntercellSpacing()方法你设置一个列模型(如果你选择这样做),因为它基本上调用setColumnMargin() on JTable 本身的 current TableColumnModelsetRowMargin()
    【解决方案3】:

    您可以将边框颜色设置为单元格的背景颜色。另外,请查看这些示例,

    http://www.java2s.com/Code/Java/Swing-Components/CellBorderTableExample.htm

    http://www.esus.com/docs/GetQuestionPage.jsp?uid=1290

    【讨论】: