2012-04-23 45 views
6

如何完全除去JTable中的单元格周围的单元格,以便单元格之间没有间隙? 这是我曾尝试:完全除去jtable网格(单元格边框)

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

并写入单元格渲染器,并使用:为每个单独的电池

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

但结果是细胞之间的线被删除,但他们之间留下1像素的差距。

回答

12

并写入单元格渲染器,并使用:

一切都取决于什么渲染器返回,但没有渲染工程我

  • setIntercellSpacing()

  • setShowGrid()

enter image description here

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

注意,你必须调用'setIntercellSpacing()'方法_after_设置柱形模型(如果你选择这样做),因为它基本上调用'setColumnMargin()'的'_current_ TableColumnModel'和'JTable'本身的'setRowMargin()'。 – hendrik 2013-10-28 22:30:26

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()); 
+0

这是避免在所选行中出现令人讨厌的白色1像素网格的最佳解决方案。也许我会建议覆盖getColumnMargin总是返回0,而不是重写setColumnMargin方法,但它非常接近。 – Ansharja 2017-09-20 13:00:58