【问题标题】:java swing layout of two componentsjava swing布局两个组件
【发布时间】:2011-12-12 16:52:00
【问题描述】:
    +--------------------------------------------+
    |                 +-------+      +----------+|
    |                 | +---+ |      |  +-----+ ||
    |                 | | A | |      |  |  B  | ||
    |                 | +---+ |      |  +-----+ ||
    |                 +-------+      +----------+|
    +--------------------------------------------+
                          ^
                          |
                          |
                        Center

背景:我有

  • 一个 JButton ("A"),大小 50x25,在 JPanel (FlowLayout.CENTER) 内
  • 一个 JLabel ("B"),大小 100x25,在 JPanel (FlowLayout.RIGHT) 内
  • 两个 JPanel 在一个 JPanel 中

想要的结果:我想要

  • JButton“A”总是水平居中,
  • JLabel “B”始终与右侧齐平。

我尝试过的事情:这些对我不起作用

  • BorderLayout 不适合我,因为 JButton“A”向左移动:
  • 我不希望在 WEST 中放置一个不可见的组件来撤消转移

    +--------------------------------------------+
    |            +-------+           +----------+|
    |            | +---+ |           |  +-----+ ||
    |            | | A | |           |  |  B  | ||
    |            | +---+ |           |  +-----+ ||
    |            +-------+           +----------+|
    +--------------------------------------------+
                     ^    ^
                     |    |
                     |    |
                     |  Center
                     |
                   Shifted Left
    
  • GridLayout 不起作用,因为我不想展开“A”和“B”

感谢任何建议!

附言

每个 JButton/JLabel 都在它们自己的 JPanel 内部,因为没有 Jpanel,BorderLayout.CENTER 会将 JButton 扩展到主面板的整个宽度(直到 JLabel 的左边缘)。 JPanel 不需要/对问题的陈述至关重要

结论

  • 我选择了下面发布的“充满鳗鱼的气垫船”答案。谢谢!

【问题讨论】:

  • 永远不要明确设置任何组件的大小,这已经在这里重复了无数次!
  • 你为什么要把你的每个JButtonJLabel放到他们自己的“私人”JPanels中,这样做有什么理由吗?
  • 除非按钮不包含文本,否则你怎么知道它需要 100x25(不小于,不,更重要的是大于)。标签也是如此。
  • “你看到了吗?” 不,我没看到……在 Mac 上。或 *nix,因为这些东西只针对一个操作系统。 Java 布局的重点是它们足够健壮,可以处理不同的平台、PLAF、屏幕尺寸、分辨率……哦,忘记平台布局“holiwar”——Java 是不可知的。 ;)
  • @Vlad:我不知道你的陈述“证明”了 WPF 的布局更好,而只是在这个例子中它们更简单。即使它们对于所有用途都更简单,但简单性只是一个因素;我们不知道它们的功能或可扩展性。

标签: java swing layout alignment


【解决方案1】:

您应该嵌套 JPanel 并使用布局组合。将持有 JButton 的面板放置到另一个使用 GridLayout(1, 0) 的 JPanel(1 行,可变列数)中可以工作,并将该 JPanel 放置到 BorderLayout.NORTH 位置 - 使用 JPanel 可以工作。

例如

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

【讨论】:

  • 对于这种微不足道的布局,真的没有更简单的方法了吗? :(
  • 1) 这并不简单,2) 这很简单。
  • +1 表示 GridLayout 和一个空的左侧占位符。这正是我所建议的。
  • 如果您不介意使用 3rd 方库,另一个选择是 MiG Layout
  • @Vlad:我不反对你。每个工具都有其相对的优势和劣势。我个人喜欢 Swing 布局管理器,但我对它们比较了解,并且很乐意快速创建一个布局,但同样,我并不是说它们是最佳的,因为它们不是。但它们确实有效,而且它们具有很强的可扩展性。
猜你喜欢
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 2019-04-04
  • 2018-05-03
  • 2014-12-20
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多