2012-04-23 33 views
6

Làm cách nào để loại bỏ đường viền xung quanh các ô trong một JTable xoay hoàn toàn, vì vậy các ô không có khoảng trống giữa chúng? Dưới đây là những gì tôi đã cố gắng:xóa lưới jtable (đường viền ô) hoàn toàn

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

và viết một renderer di động và sử dụng:

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

cho mỗi tế bào riêng lẻ.

Nhưng kết quả là các đường giữa các ô bị xóa nhưng khoảng cách 1 pixel nằm giữa chúng.

Trả lời

12

và viết một renderer di động và sử dụng:

tất cả mọi thứ phụ thuộc gì Renderer trả nhưng không Renderer làm việc cho me

  • 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

Lưu ý, bạn phải gọi 'setIntercellSpacing() 'phương pháp _after_ bạn thiết lập một mô hình cột (nếu bạn chọn làm như vậy), bởi vì nó cơ bản gọi là' setColumnMargin()' trên _current_ 'TableColumnModel' và 'setRowMargin()' trên chính 'JTable'. – hendrik

1

Bạn có thể sử dụng các phương pháp trong JTable để loại bỏ lưới nếu mô hình cột của bạn không tự động tạo ra (mà không có ràng buộc dữ liệu).

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

Nhưng nếu bạn tạo mô hình cột sử dụng ràng buộc dữ liệu thì bạn gặp sự cố. Đó là ngay cả khi bạn gọi những phương pháp này của họ vẫn còn sơn trắng khoảng cách 1 pixel trong mỗi lề cột.

Bạn có thể xóa lề cột đó bằng cách sử dụng DefaultTableColumnModel tùy chỉnh.

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

Sau đó, bạn có thể thêm mô hình cột bảng tùy chỉnh vào bảng của mình.

setColumnModel(new CustomDefaultTableColumnModel()); 
+0

Đây là giải pháp tốt nhất để tránh có mạng lưới màu 1 pixel màu trắng khó chịu trong hàng đã chọn. Có lẽ tôi sẽ khuyên bạn nên ghi đè getColumnMargin để trả về 0 luôn, thay vì ghi đè phương thức setColumnMargin, nhưng nó rất gần. – Ansharja

Các vấn đề liên quan