2014-12-28 6 views
5

Seine ziemlich grundlegende Benutzeroberfläche, aber ich kann die JCheckBox Tasten nicht so einrichten, dass sie unmittelbar hintereinander (vertikal) ohne Abstand platziert werden. Wie würde ich den Abstand verringern, der unten gesehen wird?Entfernen Sie riesige Lücken zwischen den Kontrollkästchen auf dem Panel

JPanel debugDrawPanel = new JPanel(new GridLayout(0,1));   
JPanel eastPanel = new JPanel(new GridLayout(1,0)); 
JTabbedPane tab = new JTabbedPane(); 

click = new ClickPanel(this); 

setSettings(new Settings()); 

for (Setting setting: getSettings().getAll()){ 

    JCheckBox checkBox = new JCheckBox(setting.name); 
    checkBox.setName(setting.name); 
    checkBox.addItemListener(new CheckBoxItemListener(this)); 
    debugDrawPanel.add(checkBox); 
} 

tab.addTab("Object Parameters", click); 
tab.addTab("Debug Draw", debugDrawPanel); 

screenshot

+0

Haben Sie 'Pack versucht()'? –

+0

Angenommen, Sie meinen 'JFrame.pack()', hat es keinen Effekt – bobbyrne01

+0

1) Für eine bessere Hilfe früher, ein [MCVE] (http://stackoverflow.com/help/mcve) (Minimal Complete Verifizierbar Beispiel) oder SSCCE] (http://www.sscce.org/) (Kurz, selbstständig, korrektes Beispiel). 2) Ich würde vermuten, dass die minimale vertikale Größe durch den Inhalt einer anderen Registerkarte festgelegt wird. Eine Möglichkeit, dies zu umgehen, besteht darin, das "GridLayout" in die "PAGE_START" eines "BorderLayout" zu setzen, bevor das Panel mit dem Rahmenlayout in das Registerkartenfenster gelegt wird. –

Antwort

4

Es scheint, dass die minimale vertikale Größe durch den Inhalt eines anderen Register gesetzt wird. Eine Möglichkeit, um das zu umgehen, ist, die GridLayout in die einer BorderLayout setzen, bevor Sie das Panel mit Border-Layout in das Registerkartenfenster setzen.

enter image description here

  • Das Panel mit GridLayout hat eine orange BG.
  • Das Panel mit BorderLayout hat eine gelbe BG.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class TopAlignedComponents { 

    private JComponent ui = null; 

    TopAlignedComponents() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new BorderLayout(4,4)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     JTabbedPane tb = new JTabbedPane(); 
     ui.add(tb); 
     Image spacer = new BufferedImage(300, 100, BufferedImage.TYPE_INT_RGB); 
     tb.addTab("Spacer", new JLabel(new ImageIcon(spacer))); 

     String[] labels = {"Shapes", "Joints", "AABBs"}; 
     JPanel checkPanel = new JPanel(new GridLayout(0, 1, 4, 4)); 
     checkPanel.setBackground(Color.ORANGE); 
     for (String label : labels) { 
      checkPanel.add(new JCheckBox(label)); 
     } 

     JPanel checkConstrain = new JPanel(new BorderLayout()); 
     checkConstrain.setBackground(Color.YELLOW); 
     checkConstrain.add(checkPanel, BorderLayout.PAGE_START); 

     tb.addTab("Check", checkConstrain); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       TopAlignedComponents o = new TopAlignedComponents(); 

       JFrame f = new JFrame("Top Aligned Components"); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
4

Wenn ich mich richtig erinnere, sein wegen Ihres Layouts!

GridLayout teilt Ihre Fenstergröße in gleiche Teile, also sollten Sie entweder Ihre Fenstergröße aufheben und pack() verwenden oder Sie können zu einem anderen Layout wechseln.

(ich nehme an Größe Ihres Fensters oder Minimalgröße irgendwo eingestellt)

+0

Ich habe 'JFrame.setSize (maxX, maxY)' entfernt und das Fenster öffnet 1x1 Pixel, wenn ich es größer mache, sind die 'JCheckBox's immer noch im Abstand – bobbyrne01

+0

@bobby: Ja, Sie wollen Ihre Layouts so reparieren, dass sie funktionieren besser. Vielleicht verwende GridLayout für das JPanel, das die Kontrollkästchen enthält, und verwende ein BorderLayout für das JPanel, das die wichtigsten Komponenten und Container der obersten Ebene enthält. Legen Sie keine Größen oder bevorzugten Größen fest, rufen Sie pack() auf, nachdem Sie alles zur GUI hinzugefügt haben und bevor Sie es sichtbar machen. Am wichtigsten ist, dass Sie die Layout-Manager-Tutorials lesen. –

Verwandte Themen