2010-07-26 9 views
31

Si vous exécutez le petit exemple ci-dessous, vous verrez une bordure autour de la région centrale. Je ne suis pas sûr de savoir pourquoi cette frontière est visible.Comment se débarrasser de la bordure avec un JTable/JScrollPane

Cela se produit lorsqu'un JTable se trouve dans un JScrollPane. J'ai essayé différentes choses pour l'enlever mais jusqu'ici pas de chance. Un JTable sans le JScrollPane n'affiche aucune bordure.

Voir l'exemple ci-dessous. 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

Au lieu de définir la bordure null, avez-vous essayer BorderFactory.createEmptyBorder()? –

+0

Aussi, ne négligez pas de 'pack()' le 'frame'. – trashgod

Répondre

52

Utilisez BorderFactory.createEmptyBorder() au lieu de null ...

en utilisant:

sp.setBorder(createEmptyBorder()); 

Ça marche.

Votre principale méthode devient:

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

Merci! Ça a l'air bien maintenant. :) – sproketboy

+1

Cool :). Je pense (mais pas sûr) que le comportement par défaut des composants swing est d'avoir une bordure de ligne. Donc, la classe BorderFactory est votre ami pour les personnaliser :) –

+0

Très bonne réponse! J'ai aussi résolu mon problème !! – Handsken

4

Il est intéressant de la frontière disparaît lorsque vous supprimez cette ligne:

sp.setBorder(null); 
+1

Pas pour moi avec Windows XP. Peut-être que c'est un problème de plateforme. – sproketboy

+0

Cela dépend certainement de votre L & F. Sur OS X, vous obtenez une très petite bordure qui, je pense, est censée ressembler à une ombre ou quelque chose (pas tout à fait sûr - j'ai placé le composant dans un endroit non standard où la bordure n'a pas l'air juste, il.) – ArtOfWarfare

0

Je pense que la solution appropriée est de fixer la frontière sur la viewportView à « null ».

5

Je cherchais la réponse à la même question, mais au-dessus des réponses ne pouvait pas faire ... donc j'ai trouvé une meilleure réponse:

JScrollPane jsp = new JScrollPane(); 

//ur other codes 

jsp.setViewportBorder(null); 
0

Pour JTable table.setIntercellSpacing(new Dimension(0, 0)) œuvres.