两个组件的java swing布局
背景:我有两个组件的java swing布局,java,swing,layout,alignment,Java,Swing,Layout,Alignment,背景:我有 JPanel(FlowLayout.CENTER)内尺寸为50x25的JButton(“a”) JPanel内尺寸为100x25的JLabel(“B”)(FlowLayout.右) 两个JPanel在一个JPanel中 期望的结果:我想要 按钮“A”始终水平居中 JLabel“B”应始终与右侧齐平 我尝试过的事情:这些对我不起作用 BorderLayout不适用于我,因为JButton“A”向左移动: 我宁愿不把一个看不见的组件放在西边来撤销这个转移 +------
- JPanel(FlowLayout.CENTER)内尺寸为50x25的JButton(“a”)
- JPanel内尺寸为100x25的JLabel(“B”)(FlowLayout.右)
- 两个JPanel在一个JPanel中
- 按钮“A”始终水平居中
- JLabel“B”应始终与右侧齐平
- BorderLayout不适用于我,因为JButton“A”向左移动:
- 我宁愿不把一个看不见的组件放在西边来撤销这个转移
+--------------------------------------------+ | +-------+ +----------+| | | +---+ | | +-----+ || | | | A | | | | B | || | | +---+ | | +-----+ || | +-------+ +----------+| +--------------------------------------------+ ^ | | Center
- GridLayout无法工作,因为我不希望“A”和“B”被扩展
- 我选择了下面贴的“满是鳗鱼的气垫船”的答案。谢谢李>
+--------------------------------------------+
| +-------+ +----------+|
| | +---+ | | +-----+ ||
| | | A | | | | B | ||
| | +---+ | | +-----+ ||
| +-------+ +----------+|
+--------------------------------------------+
^ ^
| |
| |
| Center
|
Shifted Left
永远不要显式设置任何组件大小,这里已经重复了无数次了!为什么要将
JButton
和JLabel
放入各自的“专用”JPanel
中,这样做是否有原因?除非按钮不包含文本,否则您如何知道它将需要100x25(不小于,&不,更重要的是,大于)。标签也是一样,“你看到了吗?”不,我看不到。。在Mac上。或者*nix,因为这些东西只针对一个操作系统。Java布局的要点是,它们足够健壮,可以处理不同的平台、PLAF、屏幕大小和分辨率。。哦,忘了平台布局“holiwar”——Java是不可知论的@弗拉德:我不知道你的陈述是否“证明”了WPF的布局更好,而只是在这个例子中它们更简单。即使它们在所有用途上都比较简单,但简单只是一个因素;我们不知道它们的功能和可扩展性。对于这样一个琐碎的布局,真的没有更简单的方法吗(1) 这不是小事,2)这很容易。+1用于GridLayout和一个空的左占位符。这正是我的建议。如果你不介意使用第三方库,另一个选择是@Vlad:I并不反对你。每种工具都有其相对的优势和劣势。我个人喜欢Swing布局管理器,但我对他们比较了解,并且很乐意快速创建一个布局,但我并不是说他们是最优的,因为他们不是。但它们确实可以工作,而且它们具有很强的可扩展性。
import java.awt.*;
import javax.swing.*;
public class Foo003 {
private static void createAndShowGui() {
JButton btnA = new JButton("A");
JButton btnB = new JButton("B");
btnA.setPreferredSize(new Dimension(50, 25));
btnB.setPreferredSize(new Dimension(100, 25));
JPanel btnAPanel = new JPanel(); // uses default FlowLayout.CENTER
JPanel btnBPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
btnAPanel.add(btnA);
btnBPanel.add(btnB);
JPanel topPanel = new JPanel(new GridLayout(1, 0));
topPanel.add(new JLabel("")); // empty placeholder label
topPanel.add(btnAPanel);
topPanel.add(btnBPanel);
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(topPanel, BorderLayout.NORTH);
mainPanel.setPreferredSize(new Dimension(400, 300));
JFrame frame = new JFrame("Foo003");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}