你的问题是XY问题,你问,“我怎么做X”当更好的解决方案不是做“X”,而是做“Y”时。
在这里,您将询问如何设置按钮的首选大小,以便使按钮大小相等,而事实上,更好且规范正确的解决方案不是这样做,而是使用更好的布局管理器,一个为您调整按钮大小的管理器——GridLayout。
例如,创建一个新的JPanel来保存按钮,比如buttonPanel,给它一个GridLayout,比如
new GridLayout(1, 0, 3, 0)
,然后向其中添加按钮,然后将此JPanel添加到主JPanel。
例如。,
import java.awt.GridLayout;
import javax.swing.*;
@SuppressWarnings("serial")
public class LayoutEg extends JPanel {
private static final int KILO_FIELD_COLS = 15;
private static final int GAP = 3;
private JTextField kiloTextField = new JTextField(KILO_FIELD_COLS);
private JButton calcButton = new JButton("Calculate");
private JButton alertButton = new JButton("Alert");
public LayoutEg() {
// add ActionListeners etc....
JPanel enterPanel = new JPanel();
enterPanel.add(new JLabel("Enter a distance in kilometers:"));
enterPanel.add(kiloTextField);
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, GAP, 0));
buttonPanel.add(calcButton);
buttonPanel.add(alertButton);
setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
setLayout(new GridLayout(0, 1));
add(enterPanel);
add(buttonPanel);
}
private static void createAndShowGui() {
LayoutEg mainPanel = new LayoutEg();
JFrame frame = new JFrame("Kilometer Converter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
代码说明:
kiloTextField中列数的常量
private static final int KILO_FIELD_COLS = 15;
J按钮之间的间隙和主J面板周围的间隙(空边框)的常数
private static final int GAP = 3;
15列宽的JTextField
private JTextField kiloTextField = new JTextField(KILO_FIELD_COLS);
持有JLabel和JTextField的顶部JPanel。默认情况下,它使用FlowLayout:
JPanel enterPanel = new JPanel();
enterPanel.add(new JLabel("Enter a distance in kilometers:"));
enterPanel.add(kiloTextField);
这里是问题的关键,创建一个JPanel,它使用
GridLayout(1, 0, 3, 0)
,这是一个具有1行的网格布局
变量
具有3水平间距且没有垂直间距的列数(0秒参数)。然后添加我们的按钮:
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, GAP, 0));
buttonPanel.add(calcButton);
buttonPanel.add(alertButton);
在主JPanel周围放置一个3像素宽的边框
setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
为主JPanel提供一个具有可变行数(0)和1列的GridLayout,并将enterPanel和buttonPanel添加到其中:
setLayout(new GridLayout(0, 1));
add(enterPanel);
add(buttonPanel);
在评论中有更多的解释,特别是
钥匙
方法,
.pack()
:
// create the main JPanel
LayoutEg mainPanel = new LayoutEg();
// create a JFrame to put it in, although better to put into a JDialog
JFrame frame = new JFrame("Kilometer Converter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// add the LayoutEg JPanel into the JFrame
frame.getContentPane().add(mainPanel);
// **** key method*** that tells the layout managers to work
frame.pack();
// center and display
frame.setLocationRelativeTo(null);
frame.setVisible(true);