ето SSCCE:
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BoxLayoutTest extends JFrame {
public BoxLayoutTest(){
JPanel main = new JPanel();
main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
main.setBackground(Color.red);
this.add(main);
JPanel northPanel = new JPanel();
JPanel middle = new JPanel();
middle.setLayout(new BoxLayout(middle, BoxLayout.X_AXIS));
middle.add(new JButton("FOO"));
middle.add(Box.createHorizontalGlue());
JPanel aPanel = new JPanel();
aPanel.setBackground(Color.black);
JComboBox b = new JComboBox();
//b.setPreferredSize(new Dimension(100,16)); //uncomment this to see the layout I would like to achieve
//b.setMaximumSize(new Dimension(100,16));
//middle.add(b); //uncomment this line
middle.setBackground(Color.green);
northPanel.setBackground(Color.blue);
main.add(northPanel);
main.add(middle);
main.add(Box.createVerticalGlue());
this.setSize(800,600);
this.setResizable(true);
this.setVisible(true);
}
public static void main(String[] args) {
new BoxLayoutTest();
}
}
Опитвам се да преработя някои класове, които написах преди време, когато не знаех, че използването на методи setXXXSize върху компоненти е грешно. Използвайки рамка с възможност за промяна на размера, резултатът, който искам да постигна, е следният:
- Северният панел трябва да остане отгоре и да промени размера си в съответствие с модификациите на размера на рамката (изглежда, че работи добре)
- Зеленият панел, където поставям JButton, трябва да запази максималния размер на JButton и да остане точно под синия панел по-горе (това работи добре, ако поставям само JButton вътре в този панел).
Проблемът възниква, ако поставя JComboBox в зеления панел (опитайте се да разкоментирате реда в SSCCE). Предполагам, че JComboBox няма посочен максимален размер, така че се разтяга с рамката. В предишната грешна версия на моя код използвах методи setxxxSize на JComboBox, за да огранича размерите му (опитайте се да премахнете коментарите от реда на методите setXXXSize, за да го видите).
Въпросът ми е:
- Възможно ли е да се постигне същия резултат с помощта на BoxLayout без извикване на методи setXXXSize()?
- Ако да, как?
- Има ли друг LayoutManager, който мога да използвам, за да постигна този ефект?
Моля, насочете ме в правилната посока