Все контейнеры имеют свой собственный контекст координат, это означает, что 0x0
- это верхний / левый угол самого контейнера, независимо от того, где он находится в родительском контейнере.
Я пытаюсьцентрирование JLabel в верхней части 800x600 JPanel
Затем используйте соответствующий менеджер компоновки и избегайте всех странностей метрик шрифта, DPI и конвейеров рендеринга, которые существуют во всех других системах / ОС
(Этот пример также адаптируется к изменениям размера экрана, и вам не нужно было ничего делать, бонус)
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
add(new JLabel("I'm in the middle"));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
}
}
в верхней части
Упс, возможно, неправильно истолковано это ?
В этом случае вы могли бы сделать что-то вроде ...
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.NORTH;
add(new JLabel("I'm in the middle"), gbc );
}
Другим вариантом может быть использование BorderLayout
public TestPane() {
setLayout(new BorderLayout());
JLabel label = new JLabel("I'm in the middle");
label.setHorizontalAlignment(JLabel.CENTER);
add(label, BorderLayout.NORTH);
}
, которое может упростить компоновку, так как вам потребуется отдельный компонент для позиции CENTER
вместо
См. Компоновка компонентов в контейнере для получения более подробной информации
Но мне приходится вручную устанавливать компонент по причинам ....
99,9% времени, когда вы считаете, что это нужно сделать "абсолютно позиционируете ", вы не делаете.Вам просто нужно лучше понять доступные менеджеры компоновки и то, как и когда их использовать.
То, что в 0,1% времени вам действительно нужно «абсолютное позиционирование», вам, вероятно, и не нужно, возможно, вы простонужен собственный менеджер компоновки, чтобы заполнить этот крайний случай (возможно, рассмотрим MigLayout)
Эффективное размещение компонентов - сложный процесс, требующий принятия многих, множества решений и учета переменных состояний.Вам был предоставлен целый API для решения этой проблемы, вы тратите свое время впустую и все остальные, но не пользуетесь этим