【问题标题】:Staggered Top Alignment JPanels交错顶部对齐 JPanel
【发布时间】:2013-06-21 14:44:44
【问题描述】:

我正在尝试使用 FlowLayout 让我的面板垂直对齐。我希望右下角与右上面板的底部对齐,而不是该行的底部。

这是我所做的:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;



    public class BigPanel extends JPanel {

    @Override
    public Component.BaselineResizeBehavior getBaselineResizeBehavior() {
        return Component.BaselineResizeBehavior.CONSTANT_ASCENT;
    }

    @Override
    public int getBaseline(int width, int height) {
       return 0;
    }

public BigPanel() {
    FlowLayout layout = new FlowLayout();
    layout.setAlignOnBaseline(true);
    this.setLayout(layout);
    this.add(new Panel1()); // size: 340x, 160y
    this.add(new Panel2()); // size: 340x, 120y
    this.add(new Panel3()); // size: 340x, 160y
    this.add(new Panel4()); // size: 340x, 300y
}

}

如何将面板和组件简单地锚定到一组坐标?上周我多次遇到这个问题,并为我的 jlabels 等使用荒谬的解决方法。

现在的样子:

【问题讨论】:

  • 这是FlowLayout 的本质。我能想到的唯一可以开箱即用的布局是GridBagLayout,但这似乎付出了很多努力却收效甚微。另一种选择是使用GridLayout 之类的东西并创建两个面板,每列一个,并分别布局子组件

标签: java jpanel vertical-alignment


【解决方案1】:

可能有几种方法可以实现这一点,但最简单的方法是使用复合布局。

使用两个面板作为列,然后将它们放置到主容器上。然后,您可以在其中放置其他组件。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class CompundLayout {

    public static void main(String[] args) {
        new CompundLayout();
    }

    public CompundLayout() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {

            JPanel left = new JPanel();
            JPanel right = new JPanel();

            setLayout(new GridLayout(0, 2, 2, 2));

            left.add(createPane(Color.RED));
            left.add(createPane(Color.GREEN));
            right.add(createPane(Color.BLUE));
            right.add(createPane(Color.MAGENTA));

            add(left);
            add(right);

        }

        protected JPanel createPane(Color color) {

            SimplePane pane = new SimplePane();
            pane.setBorder(new LineBorder(color));

            return pane;

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.dispose();
        }
    }

    public class SimplePane extends JPanel {

        private int width;
        private int height;

        public SimplePane() {

            width = 100;
            height = 50 + (int) Math.round(Math.random() * 100);

        }

        @Override
        public Dimension getPreferredSize() {

            return new Dimension(width, height);

        }

    }

}

【讨论】:

  • 感谢您的方法。这就是我最终做的。但是,我遇到了很多更复杂的面板问题,需要多个标签的框等,所以我想知道是否可以通过左上角(或中心 - 这只是一个快速调整)将事物锚定到一组像素坐标。
  • 不建议使用像素定位,因为您开发时使用的字体属性很可能不是客户端机器的字体属性。您会发现在 Sstandard JDK 中提供锚定功能的唯一布局是 GridBagLayout,但我认为您最终会陷入噩梦,试图让它以您想要的方式工作
  • 如果字体属性都在 JLabel 等固定大小的组件中,为什么它们很重要?
  • 标签的大小不是固定的,它取决于当前操作系统设置下字体的大小,字体点、DPI和屏幕大小等会改变多少空间他们将需要渲染。即使在不同 PC 上的操作系统中,字体指标也可能不同。这是布局管理器的重点,可以消除猜测
猜你喜欢
  • 1970-01-01
  • 2014-05-19
  • 2022-08-23
  • 2014-09-17
  • 2012-05-03
  • 1970-01-01
  • 2015-10-18
  • 2011-10-13
  • 2017-01-28
相关资源
最近更新 更多