Где X и Y начинаются в поворотных окнах - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь центрировать JLabel на вершине JPanel 800x600, выполняя

JLabel name = new JLabel();
name.setBounds(400, 300, 600, 100);

Однако это помещает текст в какое-то странное место, из-за которого я думаю, что координаты X и Y начинаются где-то по-другому,Есть идеи?

1 Ответ

0 голосов
/ 14 декабря 2018

Все контейнеры имеют свой собственный контекст координат, это означает, что 0x0 - это верхний / левый угол самого контейнера, независимо от того, где он находится в родительском контейнере.

Я пытаюсьцентрирование JLabel в верхней части 800x600 JPanel

Затем используйте соответствующий менеджер компоновки и избегайте всех странностей метрик шрифта, DPI и конвейеров рендеринга, которые существуют во всех других системах / ОС

Centered Simply

(Этот пример также адаптируется к изменениям размера экрана, и вам не нужно было ничего делать, бонус)

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 для решения этой проблемы, вы тратите свое время впустую и все остальные, но не пользуетесь этим

...