2010-07-26 41 views
31

Si ejecuta la pequeña muestra a continuación, verá un borde alrededor de la región central. No estoy seguro de por qué se muestra este borde.Cómo deshacerse del borde con un JTable/JScrollPane

Ocurre cuando una JTable está en un JScrollPane. Intenté varias cosas para eliminarlo, pero hasta ahora no tuve suerte. Una JTable sin el JScrollPane no muestra ningún borde.

Vea el siguiente ejemplo. 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

En lugar de establecer un borde nulo, ¿has probado BorderFactory.createEmptyBorder()? –

+0

Además, no omita 'pack()' the 'frame'. – trashgod

Respuesta

52

Uso BorderFactory.createEmptyBorder() en lugar de null ...

mediante el uso de:

sp.setBorder(createEmptyBorder()); 

funciona.

Su principal método se convierte en:

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

Gracias! Se ve bien ahora. :) – sproketboy

+1

Genial :). Creo (pero no estoy seguro) que el comportamiento predeterminado de los componentes oscilantes es tener un borde de línea. Entonces la clase BorderFactory es tu amigo para personalizarlos :) –

+0

¡Muy buena respuesta! ¡Solucionado mi problema también! – Handsken

4

Curiosamente la frontera desaparece cuando se quita esta línea:

sp.setBorder(null); 
+1

No es para mí con Windows XP. Tal vez es un problema de plataforma. – sproketboy

+0

Esto definitivamente depende de su L & F. En OS X, se obtiene un borde muy pequeño que creo que se supone que debe verse como una sombra o algo así (no estoy seguro - coloqué el componente en un lugar no estándar donde el borde no se veía bien, por lo tanto mi deseo de eliminar it.) – ArtOfWarfare

0

creo que la solución adecuada es fijar la frontera en el viewportView a 'nulo'.

5

que estaba buscando la respuesta a la misma pregunta pero sobre respuestas no podían hacer ... así que encontré una mejor respuesta:

JScrollPane jsp = new JScrollPane(); 

//ur other codes 

jsp.setViewportBorder(null); 
0

Para JTable table.setIntercellSpacing(new Dimension(0, 0)) obras.

Cuestiones relacionadas