Java 交错顶部对齐JPanel
我试图使用FlowLayout使面板垂直对齐。我希望右下角对齐右上角面板的底部,而不是该行的底部 以下是我所做的: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
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上的操作系统中,字体度量也可能不同。这是布局管理者的重点,他们要做的是排除猜测工作