Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 交错顶部对齐JPanel_Java_Jpanel_Vertical Alignment - Fatal编程技术网

Java 交错顶部对齐JPanel

Java 交错顶部对齐JPanel,java,jpanel,vertical-alignment,Java,Jpanel,Vertical Alignment,我试图使用FlowLayout使面板垂直对齐。我希望右下角对齐右上角面板的底部,而不是该行的底部 以下是我所做的: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BigPanel extends JPanel { @Override public Component.BaselineResizeBehavior getBaseli

我试图使用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
}
}

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

现在的样子:


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

使用两个面板作为立柱,然后将其放置在主容器上。然后将其他组件放入这些组件中

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

        }

    }

}


这就是
FlowLayout
的本质。我能想到的唯一一种能够实现这种开箱即用的布局是
GridBagLayout
,但这似乎是徒劳无益的。另一种选择是使用类似于
GridLayout
的东西,创建两个面板,每个列一个,并为该方法分别布局子组件。这就是我最后做的。然而,我遇到了很多问题,比如更复杂的面板,需要多个标签的盒子等等,所以我想知道是否有可能通过它们的左上角(或中间-这只是一个快速调整)来定位到一组像素坐标。像素定位是不明智的,因为您使用的字体属性很可能不是客户端计算机的字体属性。在Sstandard JDK中,您会发现唯一提供锚定功能的布局是GridBagLayout,但我认为您最终会在night mare中尝试让它按您想要的方式工作。如果字体属性都在固定大小的组件(如JLabel)中,那么字体属性又有什么关系呢?标签不是固定大小的,这取决于字体在操作系统当前设置下呈现的大小,例如字体点、DPI和屏幕大小将在那里改变,它们需要多少空间来呈现。即使在不同PC上的操作系统中,字体度量也可能不同。这是布局管理者的重点,他们要做的是排除猜测工作