2010-07-26 9 views
31

Jeśli wybierzesz małą próbkę poniżej, zobaczysz granicę wokół środkowego regionu. Nie wiem, dlaczego ta granica się wyświetla.Jak pozbyć się granicy za pomocą JTable/JScrollPane

Zdarza się, gdy JTable jest w JScrollPane. Próbowałem różnych rzeczy, żeby go usunąć, ale jak dotąd nie miałem szczęścia. JTable bez JScrollPane nie pokazuje granicy.

Zobacz przykład poniżej. 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

Zamiast ustawiać zerową granicę, czy próbowałeś BorderFactory.createEmptyBorder()? –

+0

Nie zaniedbuj również 'pack()' 'frame'. – trashgod

Odpowiedz

52

Zastosowanie BorderFactory.createEmptyBorder() zamiast null ...

za pomocą:

sp.setBorder(createEmptyBorder()); 

to działa.

Twoim głównym metoda staje:

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

Dzięki! Wygląda teraz dobrze. :) – sproketboy

+1

Fajnie :). Myślę (ale nie jestem pewien), że domyślnym zachowaniem komponentów swing jest granica linii. Tak więc klasa BorderFactory jest twoim przyjacielem, aby je dostosować :) –

+0

Bardzo dobra odpowiedź! Naprawiono też mój problem !! – Handsken

4

ciekawe granica znika po usunięciu tej linii:

sp.setBorder(null); 
+1

Nie dla mnie z Windows XP. Może to problem z platformą. – sproketboy

+0

To zdecydowanie zależy od twojego L & F. Na OS X dostajesz bardzo małą ramkę, która moim zdaniem ma wyglądać jak cień lub coś (nie do końca pewna - umieściłem komponent w niestandardowym miejscu, gdzie granica po prostu nie wyglądała dobrze, a więc moje pragnienie usunięcia to.) – ArtOfWarfare

0

myślę właściwa poprawka jest ustalenie granicy na viewportView do „null”.

5

szukałem odpowiedzi na to samo pytanie, ale przede odpowiedzi nie może zrobić ... więc znalazłem lepszą odpowiedź:

JScrollPane jsp = new JScrollPane(); 

//ur other codes 

jsp.setViewportBorder(null); 
0

Dla JTable table.setIntercellSpacing(new Dimension(0, 0)) prac.

Powiązane problemy