Java:展开JButton以填充Container

时间:2012-12-09 23:17:42

标签: java swing jpanel jbutton

我有JButton我希望扩展以填充持有它的JPanel的大小。我尝试过几种不同的方式,没有运气。以下是一些尝试:

  1. 建议的手动大小设置here - 按钮大小没有变化。

    panel  = new JPanel(new CardLayout());
    button = new JButton();
    button.setPreferredSize(new Dimension(BUTTON_SIZE, BUTTON_SIZE)); 
    panel.add(button);
    
  2. 尝试使用BorderLayout展开按钮,如here所示。尺寸没有变化。

    panel  = new JPanel(new BorderLayout());
    button = new JButton();
    panel.add(button, BorderLayout.CENTER);
    
  3. 我可能做错了什么,所以非常感谢任何帮助。

    编辑

    以下是解决问题的摘要。有两件事有效

    1. 删除LayoutManager(在new JPanel的调用中),according to Oracle默认为BorderLayout。
    2. 在接受的答案中添加维度(即new BorderLayout(0,0))。

3 个答案:

答案 0 :(得分:5)

您的第二次尝试应该有效,但这并不意味着您的整个顶级容器将由包含JPanel的{​​{1}}填充。当JButton容器中没有其他组件时,中心组件将展开以填充整个容器。

http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

  

如果窗口被放大,中心区域将获得尽可能多的可用空间。

您可以发布运行应用时所看到内容的图片吗?以下是一个工作示例。值得注意的一件事是,每个容器一直到顶部BorderLayout也使用JFrame。在您的尝试中,某些上层容器可能会限制BorderLayout的大小,因此也会限制内部的JPanel

JButton

enter image description here

答案 1 :(得分:4)

BorderLayout是最简单的解决方案。

您可能遇到的问题是如何布置父面板。将按钮添加到使用BorderLayout的面板,然后将面板添加到使用FlowLayout的面板将不会产生您所效果的效果。

enter image description here

public class ExpandButtonTest {

    public static void main(String[] args) {
        new ExpandButtonTest();
    }

    public ExpandButtonTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JButton("I'm a big button"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

答案 2 :(得分:3)

使用BorderLayout时似乎对我很好:

enter image description here

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

    public Test() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };
        panel.setLayout(new BorderLayout());

        JButton button = new JButton("Button");

        panel.add(button);

        frame.add(panel);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }
}

请发布SSCCE以显示特定问题。