2015-07-15 4 views
1

Итак, у меня крошечная программа GUI, и я решил использовать BoxLayout для отображения компонентов сверху донизу. Все работает нормально, но я не могу изменить высоту своих JButtons. Я пробовал много вещей, таких как setPreferredSize(), но тогда у меня была проблема с тем, что ширина неверна. Использование setMaximumSize() устанавливает ширину, как я хочу, но высота все еще не изменяется. Может быть, некоторые из вас могли бы мне помочь :) СпасибоJava - Как изменить высоту компонентов с помощью BoxLayout?

public class SimpleSkinViewer extends JPanel implements ActionListener{ 

    private final Dimension boxDimension = new Dimension(320, 320); 
    private final Dimension buttonDimension = new Dimension(320, 60); 
    private final Dimension spaceDimension = new Dimension(0, 5); 

    private JLabel imagebox; 
    private JButton loadButton; 
    private JButton changeButton; 
    private JButton downloadButton; 

    public SimpleSkinViewer() { 
     super(); 
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 

     imagebox = new JLabel(""); 
     imagebox.setIcon(new ImageIcon(loadImage("http://skins.minecraft.net/MinecraftSkins/AvarionDE.png"))); 

     loadButton = new JButton("Load Skin"); 
     changeButton = new JButton("Change Skin"); 
     downloadButton = new JButton("Download"); 

     //add listeners 
     loadButton.addActionListener(this); 
     changeButton.addActionListener(this); 
     downloadButton.addActionListener(this); 

     //dimensions 
     imagebox.setMaximumSize(boxDimension); 
     loadButton.setMaximumSize(buttonDimension); 
     changeButton.setMaximumSize(buttonDimension); 
     downloadButton.setMaximumSize(buttonDimension); 

     add(imagebox); 
     add(Box.createRigidArea(spaceDimension)); 
     add(loadButton); 
     add(Box.createRigidArea(spaceDimension)); 
     add(changeButton); 
     add(Box.createRigidArea(spaceDimension)); 
     add(downloadButton); 
    } 



    @Override 
    public void actionPerformed(ActionEvent arg0) { 

    } 

    //and other stuff..... 

    public static void main (String[] args) { 
     JFrame frame = new JFrame("Avarion's Simple Skin Viewer"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(new SimpleSkinViewer()); 
     frame.setLocationRelativeTo(null); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

Вы пробовали устанавливать минимальный и предпочтительный размер до требуемых размеров и максимальный размер до Short.MAX_VALUE? –

ответ

0

Из docs for BoxLayout

Когда BoxLayout вынимает компоненты сверху вниз, он пытается размер каждого компонента в предпочтительной высоты компонента.

Для макета верхней кромки, предпочтительной шириной контейнера является максимальная предпочтительная ширина детей. Если контейнер должен быть шире, чем BoxLayout пытается размер ширина каждого компонента по ширине каждого компонента до ширины контейнера (минус вставки). Если максимальный размер компонента меньше, чем ширина контейнера, то вступает в действие X-выравнивание.

Таким образом, вы можете установить как maximumSize и preferredSize, чтобы получить нужный размер.

loadButton.setMaximumSize(buttonDimension); 
    loadButton.setPreferredSize(buttonDimension); 
1

Вам нужно Box.createVerticalGlue()

Изменить

add(changeButton); 
add(Box.createRigidArea(spaceDimension)); 

с

add(changeButton); 
add(Box.createVerticalGlue()); 

Затем вы можете использовать .setPreferredSize(new Dimension(x,y)); и кнопки будут адаптироваться к ваш макет

+0

lel высота работает, но ширина нет; o – AvarionDE