【问题标题】:Java Swing Layout these componentsJava Swing 布局这些组件
【发布时间】:2013-10-12 01:38:40
【问题描述】:

我想在一个面板中布局 4 个组件 A、B、C、D,如下图所示。 我可以使用什么布局或方法来做到这一点?

附:如果将 A 和 D 平行放置更容易,则可以接受。我只希望 D 位于最右边且向北一点,但 A,B ,C 垂直居中在中间。

A B C 应该是对齐的。我为我画的不好感到抱歉。

【问题讨论】:

  • A、B、C的左右边缘是不是故意不对齐的?
  • 对于GridBagLayout 将约束的锚点设置为FIRST_LINE_END 并填充到HORIZONTAL 以获得所需的D。 (如果您需要,我可以发布示例。)
  • 你也可以尝试分层布局,JLayeredPane 和 JDesktopPane,你不使用 .add 但你还必须设置组件的 x、y、宽度、高度,这不会自然地调整你的大小自动组件,您必须编写自己的大小行为。
  • @Smitty 请发布一个示例。谢谢

标签: java swing layout user-interface awt


【解决方案1】:

有很多选择。就像其他人提到的那样,GridBagLayout 是原生 Java 中最流行和最强大的布局管理器之一。您也可以使用GroupLayout,我更喜欢它,但对于某些人来说,这更难理解...但是如果您不反对添加第 3 方库,我使用 MigLayout 大多数这些天来的一切。布局约束是字符串,所有东西放在一起都比较简单。

【讨论】:

    【解决方案2】:

    这是一个简单的例子。这将确保 D 组件始终位于右上角,而 A、B、C 组件始终位于中心。运行它并将框架拖得更大。您会看到 D 组件将始终位于面板的右上角。

    import java.awt.*;
    import javax.swing.*;
    
    public class Test {
    
        public Test() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
            frame.add(new MyPanel());
            frame.pack();
            frame.setMinimumSize(frame.getPreferredSize());
            frame.setVisible(true);
        }
    
        class MyPanel extends JPanel {    
            public MyPanel() {
                JTextField labelA = new JTextField("Your A component");
                JTextField labelB = new JTextField("Your B component");
                JTextField labelC = new JTextField("Your C component");
                JTextField labelD = new JTextField("Top Right D");
    
                JPanel north = new JPanel(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.anchor = GridBagConstraints.FIRST_LINE_END;
                gbc.weightx = 1;
                gbc.insets = new Insets(10, 10, 10, 10);
                north.add(labelD, gbc);
    
                JPanel south = new JPanel(new GridBagLayout());
                gbc.anchor = GridBagConstraints.CENTER;
                gbc.gridy = 0;
                south.add(labelA, gbc);
                gbc.gridy = 1;
                south.add(labelB, gbc);
                gbc.gridy = 2;
                south.add(labelC, gbc);
    
                setLayout(new BorderLayout());
                add(north, BorderLayout.NORTH);
                add(south, BorderLayout.CENTER);
            }
        }
    
        public static void main(String[] args) {
            new Test();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2019-04-04
      • 2018-05-03
      • 2014-12-20
      • 2017-07-11
      相关资源
      最近更新 更多