我有一个带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一个属性来给包含的组件一个优先级但我找不到它。
答案 0 :(得分:2)
我想要的是按钮位于
JPanel
的中心并且具有面板的宽度 - 每侧10 px。
这似乎最适合单个列GridLayout
,其中EmptyBorder
为10像素(除非我误解了要求)。
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"));
看起来像这样: