6

我有一个JButton我想扩展以填充JPanel持有它的 a 的大小。我尝试了几种不同的方法,但没有运气。以下是一些尝试:

  1. 此处推荐的手动尺寸设置- 按钮的尺寸没有改变。

    panel  = new JPanel(new CardLayout());
    button = new JButton();
    button.setPreferredSize(new Dimension(BUTTON_SIZE, BUTTON_SIZE)); 
    panel.add(button);
    
  2. 尝试使用 aBorderLayout来展开按钮,如此处所示。大小没有变化。

    panel  = new JPanel(new BorderLayout());
    button = new JButton();
    panel.add(button, BorderLayout.CENTER);
    

我可能做错了什么,所以非常感谢任何帮助。

编辑

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

  1. 删除 LayoutManager(在对 的调用中new JPanel),根据 Oracle默认为 BorderLayout。
  2. 将维度添加到呼叫中,如接受的答案(即new BorderLayout(0,0))。
4

3 回答 3

7

您的第二次尝试应该可以工作,但这并不意味着您的整个顶级容器将被JPanel包含您的JButton. 当容器中没有其他组件时BorderLayout,中心组件将扩展以填充整个容器。

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

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

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

frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panel = new JPanel();
panel.setLayout(new BorderLayout(0, 0));
JButton button = new JButton("I'm a button!");
panel.add(button);

frame.getContentPane().add(panel, BorderLayout.CENTER);

在此处输入图像描述

于 2012-12-09T23:24:37.037 回答
4

BorderLayout是最简单的解决方案。

您可能遇到的问题是父面板的布局方式。将按钮添加到使用的面板BorderLayout然后将面板添加到使用的面板FlowLayout不会产生您想要的效果。

在此处输入图像描述

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

}
于 2012-12-09T23:28:08.347 回答
3

使用时对我来说似乎很好BorderLayout

在此处输入图像描述

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以显示具体问题。

于 2012-12-09T23:27:39.587 回答