2016-11-24 3 views
0

Ich habe viele Themen hier gelesen, aber ich kann nicht mein Fenster mit dem Layout, das ich will. ich einfach all meine Grafikobjekte will hier in einer Reihe Stil sein, wie in dem ersten Bild: http://docs.oracle.com/javase/tutorial/uiswing/layout/box.htmlswing BoxLayout funktioniert nicht

ich Gridlayout, aber es immer noch meinen ersten Schaltfläche Riesen macht und dann versucht habe, wie ich Textfelder hinzufügen, es wird immer kleiner und kleiner ?!

Hier ist mein Code ohne alle Importe:

public class TestScrollPane extends JFrame implements ActionListener{ 
Dimension dim = new Dimension(200 , 50); 
JButton button; 
JPanel panel = new JPanel(); 
JScrollPane scrollpane = new JScrollPane(panel); 

public TestScrollPane(){ 
    scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
    this.add(scrollpane); 

    //panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

    this.setSize(300, 400); 
    this.setVisible(true); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setLocationRelativeTo(null); 

    button = new JButton("click me"); 
    button.setPreferredSize(dim); 
    panel.add(button); 
    button.addActionListener(this); 
} 


public void actionPerformed(ActionEvent e){ 
    if(e.getSource() == button){ 

     JTextField txt = new JTextField(); // we add a new button 
     txt.setPreferredSize(dim); 
     panel.add(txt); 

     SwingUtilities.updateComponentTreeUI(this); // refresh jframe 
    } 
} 

public static void main(String[] args){ 
    TestScrollPane test = new TestScrollPane(); 
} 
} 

ich nur pro Zeile eine Taste haben wollen.

Antwort

1

Ein BoxLayout berücksichtigt die minimalen/maximalen Größen einer Komponente.

Aus irgendeinem Grund ist die maximale Höhe eines Textfelds unbegrenzt, so dass das Textfeld den gesamten verfügbaren Platz erhält.

So können Sie so etwas wie:

JTextField txt = new JTextField(10); // we add a new button 
//txt.setPreferredSize(dim); // don't hardcode a preferrd size of a component. 
txt.setMaximumSize(txt.getPreferredSize()); 

auch:

//SwingUtilities.updateComponentTreeUI(this); // refresh jframe 

Sie das obige Verfahren nicht verwendet werden. Das wird für eine LAF-Änderung verwendet.

Stattdessen, wenn Sie Komponenten hinzufügen/entfernen aus einer sichtbaren GUI sollten Sie verwenden:

panel.revalidate(); 
panel.repaint(); 
+0

Dank Kumpel, ich wusste, dass es etwas über PreferredSize war, aber ich dachte, dass button.setPreferredSize (dim); war ausreichend. – zogota

+0

@zogota 'aber ich dachte, dass button.setPreferredSize (dim); war ausreichend. "- Sie sollten diese Aussage loswerden. Sie sollten nicht versuchen, die bevorzugte Größe einer Komponente zu steuern. – camickr

+0

danke für den Tipp! Ich habe versucht _button.setMinimumSize (dim) _ und ich tat das gleiche für das Textfeld, aber als ich Textfelder hinzufügen, verkleinert die Schaltfläche seine Größe und so tun sie bis zu einer bestimmten Größe, die der _dim_ Dimension unterlegen ist. Was ist los ? – zogota