2010-07-26 37 views
31

Nếu bạn chạy mẫu nhỏ bên dưới, bạn sẽ thấy một đường viền xung quanh khu vực trung tâm. Tôi không chắc tại sao đường viền này lại hiển thị.Cách loại bỏ đường viền bằng JTable/JScrollPane

Điều này xảy ra khi một JTable nằm trong JScrollPane. Tôi đã thử những thứ khác nhau để loại bỏ nó nhưng cho đến nay không có may mắn. Một JTable không có JScrollPane cho thấy không có đường viền.

Xem ví dụ bên dưới. TIA.

public class TestScrollPane extends JFrame { 

    public static void main(String[] args) { 
     JFrame frame = new TestScrollPane(); 
     JPanel panel = new JPanel(); 
     JTable table = new JTable(); 

     panel.setLayout(new BorderLayout()); 
     panel.add(new JLabel("NORTH"), BorderLayout.NORTH); 
     panel.add(new JLabel("SOUTH"), BorderLayout.SOUTH); 

     JScrollPane sp = new JScrollPane(table); 
     // None of these have any effect 
     sp.setBorder(null); 
     sp.getInsets().set(0, 0, 0, 0); 
     sp.setViewportBorder(null); 
     sp.getViewport().setBorder(null); 
     sp.getViewport().getInsets().set(0, 0, 0, 0); 
     sp.getViewport().setOpaque(true); 

     panel.add(sp, BorderLayout.CENTER); 
     // Adding the table alone shows no border 
     // panel.add(table, BorderLayout.CENTER); 
     frame.add(panel); 

     frame.setVisible(true); 
    } 

    public TestScrollPane() throws HeadlessException { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setMinimumSize(new Dimension(100, 100)); 
    } 
} 
+3

Thay vì đặt đường viền rỗng, bạn có thử dùng BorderFactory.createEmptyBorder() không? –

+0

Ngoài ra, đừng bỏ qua 'pack()' 'frame'. – trashgod

Trả lời

52

Sử dụng BorderFactory.createEmptyBorder() thay vì null ...

bằng cách sử dụng:

sp.setBorder(createEmptyBorder()); 

nó hoạt động.

phương pháp chính của bạn trở thành:

public static void main(String[] args) { 
    JFrame frame = new TestScrollPane(); 
    JPanel panel = new JPanel(); 
    JTable table = new JTable(); 

    panel.setLayout(new BorderLayout()); 
    panel.add(new JLabel("NORTH"), BorderLayout.NORTH); 
    panel.add(new JLabel("SOUTH"), BorderLayout.SOUTH); 

    JScrollPane sp = new JScrollPane(table); 
    sp.setBorder(BorderFactory.createEmptyBorder()); 
    panel.add(sp, BorderLayout.CENTER); 
    frame.add(panel); 

    frame.setVisible(true); 
} 
+0

Cảm ơn! Có vẻ ổn rồi. :) – sproketboy

+1

Cool :). Tôi nghĩ (nhưng không chắc chắn) hành vi mặc định của các thành phần swing là có đường biên giới. Vì vậy, lớp BorderFactory là bạn của bạn để tùy chỉnh chúng :) –

+0

Câu trả lời rất hay! Đã khắc phục sự cố của tôi! – Handsken

4

Điều thú vị là biên giới sẽ biến mất khi bạn loại bỏ dòng này:

sp.setBorder(null); 
+1

Không phải cho tôi với windows XP. Có thể đó là vấn đề nền tảng. – sproketboy

+0

Điều này chắc chắn phụ thuộc vào L & F của bạn. Trên OS X, bạn nhận được một đường viền rất nhỏ mà tôi cho rằng trông giống như một cái bóng hay cái gì đó (không hoàn toàn chắc chắn - tôi đặt thành phần ở một nơi không chuẩn, nơi đường viền không nhìn đúng, vì vậy mong muốn của tôi là loại bỏ nó.) – ArtOfWarfare

0

Tôi nghĩ việc sửa chữa thích hợp là để thiết lập biên giới trên viewportView để 'null'.

5

tôi đang tìm kiếm câu trả lời cho câu hỏi tương tự nhưng trên câu trả lời không thể làm được ... vì vậy tôi tìm thấy một câu trả lời tốt hơn:

JScrollPane jsp = new JScrollPane(); 

//ur other codes 

jsp.setViewportBorder(null); 
0

Đối với JTable table.setIntercellSpacing(new Dimension(0, 0)) công trình.

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