2011-01-12 14 views
5

Wie entfernen/reduzieren Sie den Abstand zwischen den Kontrollkästchen mit MigLayout ?Swing: Kontrollkästchen Abstand im Vergleich zu Etiketten

alt text

import java.util.Arrays; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import net.miginfocom.swing.MigLayout; 

public class CheckboxSpacing { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("checkbox spacing"); 
     JPanel panel = new JPanel(); 
     frame.setContentPane(panel); 
     panel.setLayout(new MigLayout()); 
     for (String verb : Arrays.asList("see","hear","speak")) 
     { 
      JCheckBox cb = new JCheckBox(verb+" no evil"); 
      panel.add(cb, "wrap"); 
     } 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

HINWEIS: Ich frage mich, vielleicht, wenn das MigLayout Teil dieser Frage eine falsche Fährte ist. Wenn ich mein Programm auf die folgenden ändern, erhalte ich diese Dialoge:

alt textalt text

Sie werden den Unterschied in Abstand zwischen den Etiketten und Kontrollkästchen beachten. Wie kann ich den überschüssigen Abstand für Checkboxen beseitigen?

import java.awt.Component; 
import java.util.Arrays; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import net.miginfocom.swing.MigLayout; 

public class CheckboxSpacing { 
    enum WhichGUI { LABEL { 
     @Override 
     public Component createComponent(String text) { 
      return new JLabel(text); 
     } 
    }, CHECKBOX { 
     @Override 
     public Component createComponent(String text) { 
      return new JCheckBox(text); 
     } 
    }; 
     abstract public Component createComponent(String text); 
    } 
    public static void main(String[] args) { 
     doit(WhichGUI.LABEL); 
     doit(WhichGUI.CHECKBOX); 
    } 
    private static void doit(WhichGUI which) { 
     JFrame frame = new JFrame("spacing: "+which); 
     JPanel panel = new JPanel(); 
     frame.setContentPane(panel); 
     panel.setLayout(new MigLayout(
        "", //layout 
        "[]", //column 
        "0" //row 
      )); 
     for (String verb : Arrays.asList("see","hear","speak")) 
     { 
      Component c = which.createComponent(
         verb+" no evil (Jabberwocky! Çgpq)"); 
      panel.add(c, "wrap 0"); 
     } 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

Antwort

5

Der Unterschied liegt in der bevorzugten Größe .. jede Komponente

String text = "Hear no evil"; 
JLabel label = new JLabel(text); 
System.out.println(label.getPreferredSize()); 
System.out.println(label.getInsets()); 

JCheckBox checkBox = new JCheckBox(text); 
System.out.println(checkBox.getPreferredSize()); 
System.out.println(checkBox.getInsets()); 

Ein Kontrollkästchen nicht-Null-Einsätze hat Dies wäre von der Grenze sein, so sollten Sie in der Lage sein, entweder:.

  1. setzen die Grenze des Kontrollkästchens auf null
  2. eine EmptyBorder zum
+1

danke! Ich hatte endlich Zeit, es zu versuchen, und das Kontrollkästchen auf Null gesetzt reduziert den leeren Raum. Es sieht so aus, als bräuchtest du ein wenig Platz, damit das Fokusrechteck richtig rendern kann, also habe ich 'cb.setBorder (new EmptyBorder (newInsets (1,1,1,1))));' und das scheint ein guter Kompromiss zu sein . –

1

Es gibt eine Reihe von Möglichkeiten, dies zu tun, und sie sind in this document gut angegeben.

Sie können den Abstand zwischen dem Raster oder den Komponenten angeben. Sie wollen wahrscheinlich so etwas wie dies zu tun:

 new MigLayout(
       "", //layout 
       "[]", //column 
       "5" //row 
     ); 

Und dass die Lücken setzen soll. Sie müssen mit den Zahlen spielen, bis Sie bekommen, was Sie wollen.

Eine zweite Option (und ich denke, Sie haben mehr Kontrolle auf diese Weise, dies zu tun ist.

panel.add(cb, "wrap 0"); 

Wo die 0 die Lücke zwischen den Zeilen gibt

+0

Es ist immer noch nicht funktioniert Etikett hinzufügen. Vielleicht ist es keine miglayout-Sache, vielleicht ist es stattdessen eine Checkbox-Sache: Wenn ich Ihren Vorschlag verwende, den Zeilenabstand auf 100 zu erhöhen, bekomme ich mehr Abstand. Aber wenn ich den Zeilenabstand auf 0 ändere, bekomme ich mehr oder weniger das, womit ich angefangen habe, und es gibt zusätzlichen Abstand, den ich nicht möchte. –

+0

Wenn ich "wrap -3" verwende, dann sieht es ungefähr richtig aus, aber es ist etwas faul, eine Zahl kleiner als 0 zu verwenden. –

+0

@Jason S Vielleicht möchten Sie sich dann die Komponentenlücke ansehen. Sie haben mehrere Optionen wie gaptop, gapleft usw., um anzugeben, wie weit die Komponente von der Kante entfernt ist. –

Verwandte Themen