我想到的最简单的解决方案是用于主面板的BorderLayout
。将textarea
添加到NORTH
/PAGE_START
。制作包含库存按钮(WEST
/LINE_START
)和位置标签(EAST
/LINE_END
)的另一个BorderLayout
。加上SOUTH
/PAGE_END
的主BorderLayout
。然后只需添加一个BoxLayout
垂直对齐主BorderLayout
的CENTER
包含两个按钮。 Here's a tutorial为标准布局管理器。
![enter image description here](https://i.stack.imgur.com/qdi4o.png)
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class Example {
public Example() {
JTextArea textArea = new JTextArea("There is a locked door");
textArea.setRows(5);
textArea.setBorder(BorderFactory.createLineBorder(Color.GRAY));
textArea.setEditable(false);
WhiteButton button1 = new WhiteButton("Go find a key") {
@Override
public Dimension getMinimumSize() {
return new Dimension(200, 25);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 25);
}
@Override
public Dimension getMaximumSize() {
return new Dimension(200, 25);
}
};
WhiteButton button2 = new WhiteButton("Attempt to force the door open");
button2.setMargin(new Insets(0, 60, 0, 60));
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
buttonPanel.add(button1);
buttonPanel.add(Box.createVerticalStrut(5));
buttonPanel.add(button2);
WhiteButton inventoryButton = new WhiteButton(
new ImageIcon(new BufferedImage(50, 50, BufferedImage.TYPE_INT_RGB)));
JLabel locationLabel = new JLabel("Location: 0");
locationLabel.setVerticalAlignment(JLabel.BOTTOM);
JPanel southPanel = new JPanel(new BorderLayout());
southPanel.add(inventoryButton, BorderLayout.WEST);
southPanel.add(locationLabel, BorderLayout.EAST);
JPanel mainPanel = new JPanel(new BorderLayout(0, 5));
mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
mainPanel.add(textArea, BorderLayout.NORTH);
mainPanel.add(buttonPanel);
mainPanel.add(southPanel, BorderLayout.SOUTH);
JFrame frame = new JFrame("Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
private class WhiteButton extends JButton {
public WhiteButton() {
setBackground(Color.WHITE);
}
public WhiteButton(String text) {
this();
setText(text);
}
public WhiteButton(ImageIcon icon) {
this();
setIcon(icon);
setBorder(BorderFactory.createLineBorder(Color.GRAY));
}
}
}
哪个组件的首选大小应该得到尊重?我想到的最简单的解决方案是主面板的“BorderLayout”。将textarea添加到'NORTH'。制作另一个包含库存按钮('WEST')和位置标签('EAST')的'BorderLayout'。将其添加到主“BorderLayout”的“SOUTH”中。然后,将一个“BoxLayout”垂直对齐到包含两个文本框的主BorderLayout的“CENTER”中。标准版面管理器的[总结](https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)。 –
关于唯一能够完成UI的布局是'GridBagLayout'和'GroupLayout'。后者通常旨在供IDE中的GUI生成器使用。除了这两个,我通常会将布局结合起来,为UI的每个部分使用最佳布局。对于底部部分,我将使用带有“BorderLayout”的单个面板,并将该图标添加到“LINE_START”,并将标签添加到“LINE_END”。要获得5px缩进,请使用底部面板上的'EmptyBorder'。 –
不要指望它,不要把你的鸡蛋放在一个篮子 - 咆哮的狗会在这里吠叫,但在几年后,你会回来“哦,我的Windows 11不运行这个东西!” – gpasch