Java - 如何使用BoxLayout更改组件高度?

时间:2015-07-15 08:11:02

标签: java swing layout-manager boxlayout

所以,我有一个很小的GUI程序,我决定使用BoxLayout从上到下显示组件。一切正常,但我无法改变JButtons的高度。我尝试过很多像 setPreferredSize()这样的东西,但后来我遇到了宽度不正确的问题。使用 setMaximumSize()设置我想要的宽度,但高度仍然没有变化。也许有些人可以帮助我:)谢谢

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

2 个答案:

答案 0 :(得分:1)

您需要Box.createVerticalGlue()

更改

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

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

然后您可以使用.setPreferredSize(new Dimension(x,y));按钮将适应您的布局

答案 1 :(得分:0)

来自docs for BoxLayout

  

当BoxLayout从上到下布置组件时,它会尝试   在组件的首选高度中确定每个组件的大小。

     

对于从上到下的框布局,容器的首选宽度   是儿童的最大首选宽度。如果   容器被迫比那更宽, BoxLayout试图调整大小   每个组件的宽度与容器宽度的宽度(减去   插图)即可。如果组件的最大大小小于宽度   容器,然后X对齐发挥作用。

因此,您可以同时设置preferredSize loadButton.setMaximumSize(buttonDimension); loadButton.setPreferredSize(buttonDimension); 以获得所需的尺寸。

    public App()
    {
        BlobCache.ApplicationName = "MyApp";
        BlobCache.EnsureInitialized();


        // The root page of your application
        MainPage = GetMainPage();
    }

    public object BlockingGetExternalUser()
    {
        return GetExternalUser().Result;
    }

    private async Task<object> GetExternalUser()
    {
        try
        {
            return await BlobCache.LocalMachine.GetObject<object>("user");
        }
        catch (KeyNotFoundException)
        {
            return null;
        }
    }