Как действительно центрировать объект в JFrame? - PullRequest
0 голосов
/ 26 мая 2019

У меня есть класс, который расширяет Jframe, и я центрирую его, используя setLocationRelativeTo(null);. LayouManager null также.

Мой JFrame:

mport com.sxf.protocol.chat.util.window.AbstractField;

import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;

public class Field extends AbstractField {

    private Container cp;

    public Field() {
        super("Test");

        buildWindow();
    }

    private void buildWindow() {

        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setPreferredSize(new Dimension(frameWidth, frameHeight));
        setResizable(false);

        cp = getContentPane();
        cp.setLayout(null);

        initComponents();

        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void initComponents() {
        JLabel label = new JLabel("Test", SwingConstants.CENTER);
        JLabel border = new JLabel("");
        label.setSize(200, 30);
        label.setLocation((frameWidth - label.getWidth()) / 2, (frameHeight - label.getHeight()) / 2);
        border.setBounds(frameWidth / 2, 0, frameWidth / 2, frameHeight);
        label.setBorder(new LineBorder(new Color(0, 0, 0)));
        border.setBorder(new LineBorder(new Color(255, 0, 0)));

        cp.add(label);
        cp.add(border);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Field();
            }
        });
    }
}

Я добавил в рамку, чтобы посмотреть, правильно ли отцентрировано.

AbstractField (только некоторые вычисления в нем):

public abstract class AbstractField extends JFrame {

    private final static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    private static final Dimension frameSize = new Dimension(screenSize.width / 4, screenSize.height / 4);
    protected static final int frameWidth;
    protected static final int frameHeight;
    protected static final int x;
    protected static final int y;

    static {
        frameWidth = frameSize.width;
        frameHeight = frameSize.height;
        x = (screenSize.width - frameWidth) / 2;
        y = (screenSize.height - frameHeight) / 2;
    }

    public AbstractField(String title) {
        super(title);
    }
}

Но когда я пытаюсь центрировать свои компоненты, например, JLabel, делающий
(frame.getWidth - component.getWidth) / 2, и то же самое для высоты, это не по центру, но немного вправо.

Это из-за родного перемещенного начала jframe и могу ли я рассчитать это?

1 Ответ

2 голосов
/ 26 мая 2019

Как на самом деле центрировать объект в JFrame?

Действительно добавить его как единственный компонент, добавленный к JPanel с GridBagLayout.Используйте эту панель в качестве панели содержимого.

Пример:

enter image description here

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

public class CenteredLabel {

    private JComponent ui = null;

    CenteredLabel() {
        initUI();
    }

    public final void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new GridBagLayout());
        ui.setBorder(new EmptyBorder(4,4,4,4));

        JLabel centeredLabel = new JLabel("Test");
        centeredLabel.setBorder(new LineBorder(Color.RED));
        ui.add(centeredLabel);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception useDefault) {
            }
            CenteredLabel o = new CenteredLabel();

            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);

            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());

            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}
...