2016-11-24 4 views
0

Я прочитал много тем здесь, но я не могу сделать свое окно с макетом, который я хочу. Я просто хочу, чтобы все мои графические объекты, чтобы быть в стиле строки, как и в первой картине здесь: http://docs.oracle.com/javase/tutorial/uiswing/layout/box.htmlswing BoxLayout не работает

Я попытался GridLayout, но это все-таки сделать свой первый кнопку гигант, а затем, как я добавить текстовые поля, это становится все меньше и меньше ?!

Вот мой код, не все импорта:

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(); 
} 
} 

Я просто хочу, чтобы иметь одну кнопку для каждой строки.

ответ

1

A BoxLayout будет соблюдать минимальные/максимальные размеры компонента.

По какой-то причине максимальная высота текстового поля не ограничена, поэтому текстовое поле получает все свободное пространство.

Таким образом, вы можете сделать что-то вроде:

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()); 

также:

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

Не использовать вышеупомянутый метод. Это используется для изменения LAF.

Вместо при добавлении/удалении компонентов из видимого GUI, вы должны использовать:

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

спасибо чувак, я знал, что это было что-то PreferredSize, но я думал, что button.setPreferredSize (тусклый); было достаточно. – zogota

+0

@zogota 'но я думал, что button.setPreferredSize (dim); было достаточно ». Вы должны избавиться от этого утверждения. Вы не должны пытаться контролировать предпочтительный размер любого компонента. – camickr

+0

спасибо за отзыв! Я попробовал _button.setMinimumSize (dim) _, и я сделал то же самое для текстового поля, но по мере добавления текстовых полей кнопка уменьшает его размер и, следовательно, делает их до определенного размера, который уступает размеру _dim_. Что происходит ? – zogota

Смежные вопросы