两个组件的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”被扩展

感谢您的建议

p、 美国

JButton/JLabel都位于各自的Jpanel内部,因为没有Jpanel,BorderLayout.CENTER会将JButton扩展到主面板的整个宽度(直到JLabel的左边缘)。JPanel对于问题的陈述不是必需的/关键的

结论

  • 我选择了下面贴的“满是鳗鱼的气垫船”的答案。谢谢
您应该嵌套JPanel并使用布局的组合。将包含JButtons的面板放置到另一个使用GridLayout(1,0)(1行,可变列数)的JPanel中可以工作,将该JPanel放置到BorderLayout.NORTH使用JPanel的BorderLayout位置可以工作

比如说

+--------------------------------------------+
|            +-------+           +----------+|
|            | +---+ |           |  +-----+ ||
|            | | 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();
         }
      });
   }
}