自动调整按钮宽度

时间:2014-01-06 00:47:34

标签: java swing jbutton layout-manager boxlayout

我有一个带3个按钮的JPanel(它是一个JPanel,它将包含一个带有按钮和JLabels 的菜单。)

按钮需要堆叠在一起,两者之间有一个小空间。

我将按钮堆叠在一起:

 BoxLayout myLayout = new BoxLayout(this, BoxLayout.Y_AXIS);
 this.setLayout(myLayout);
 this.setPreferredSize(new Dimension(300,150));

现在添加的按钮会自动堆叠,但根据文本的大小,它们的大小都不同。

我想要的是按钮位于JPanel的中心并且具有面板的宽度 - 每侧10 px。

我有什么:

给出所有按钮:

    .setPreferredSize(new Dimension(280,20));

但它没有任何不同。

为了更清楚,我将发布完整的代码,以便您可以看到我的意思:

private JButton buttonStartStop;
private JButton buttonReset;


public ViewControlsPanel()
{
    BoxLayout myLayout = new BoxLayout(this, BoxLayout.Y_AXIS);
    this.setLayout(myLayout);

    this.setPreferredSize(new Dimension(300,150));

    buttonStartStop = new JButton("Start");
    buttonStartStop.setPreferredSize(new Dimension(280,30));

    buttonReset = new JButton("Reset");
    buttonReset.setPreferredSize(new Dimension(280,20));


    this.add(buttonStartStop);
    this.add(buttonReset);

}

我试图提供不同的维度,但它没有帮助。

我的猜测是,可以给BoxLayout一个属性来给包含的组件一个优先级但我找不到它。

2 个答案:

答案 0 :(得分:2)

  

我想要的是按钮位于JPanel的中心并且具有面板的宽度 - 每侧10 px。

这似乎最适合单个列GridLayout,其中EmptyBorder为10像素(除非我误解了要求)。

Single Column Of Buttons Layout

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class SingleColumnOfButtonsLayout {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                // the GUI as seen by the user (without frame)
                JPanel gui = new JPanel(new GridLayout(0,1,10,10));
                gui.setBorder(new EmptyBorder(10,10,10,10));

                gui.add(new JButton("Start"));
                gui.add(new JButton("Reset"));
                gui.add(new JButton("A Very Long String"));

                JFrame f = new JFrame("Single Column of Buttons Layout");
                f.add(gui);
                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See http://stackoverflow.com/a/7143398/418556 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

答案 1 :(得分:2)

这只是安德鲁斯答案的扩展,以证明您可以使用任何组件。唯一的变化是我把它做成了2列宽

JPanel gui = new JPanel(new GridLayout(0,2,10,10));

并添加了不同的组件

gui.add(new JLabel("Start Label", SwingConstants.TRAILING));
gui.add(new JButton("Start"));
gui.add(new JButton("Reset"));
gui.add(new JLabel("Reset Label", SwingConstants.CENTER));
gui.add(new JComboBox(new String[]{"A","B","C"}));
gui.add(new JCheckBox("A Check Box"));

看起来像这样:

enter image description here