Почему мой компонентный центр не работает правильно при использовании правильных чисел? - PullRequest
0 голосов
/ 29 февраля 2020

Я пишу небольшую программу для входа в систему, и мне интересно, почему моя кнопка не будет располагаться по центру экрана. Это выглядит немного слишком далеко направо, но числа, которые я использовал, предположили бы, что это должно быть непосредственно в середине, с равным свободным пространством по обе стороны от него. Слева от него больше свободного места, чем справа. Любая помощь высоко ценится, спасибо.

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

public class Login extends JFrame
{
    int width = 600;
    int height = 900;

    JButton usernameTF = new JButton();

    void makeFrame()
    {
        this.setTitle("Login");
        this.setSize(width,height);
        this.setLocation(0,0);
        this.setLayout(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.getContentPane().setBackground(new java.awt.Color(140, 156, 144));

        makeComponents();

        this.setVisible(true);
    }

    void makeComponents()
    {
        usernameTF.setBounds(150,150,300,75);
        this.add(usernameTF);
    }

    public static void main(String[] args)
    {
        Login l = new Login();
        l.makeFrame();
    }
}

Ответы [ 2 ]

3 голосов
/ 01 марта 2020

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

Размер кадра включает границы и строку заголовка. Вы не учли эти размеры, когда пытались расположить компонент.

Не используйте пустой макет!

Swing был разработан для использования с менеджерами макетов. Диспетчер компоновки позволяет динамически перемещать компонент при изменении размера кадра или при изменении размера кнопки.

Самый простой способ сделать то, что вы хотите, это использовать GridBagLayout.

//this.setLayout(null);
setlayout( new GridBagLayout() );

и

//usernameTF.setBounds(150,150,300,75);
//this.add(usernameTF);
usernameTF.setPreferredSize( new Dimension(300, 75) );
add(usernameTF, new GridBagConstraints());

Ограничение по умолчанию приведет к центру компонента в доступном пространстве. Прочитайте раздел из учебника по Swing на Как использовать GridBagLayout для получения дополнительной информации и рабочих примеров.

0 голосов
/ 01 марта 2020

Используйте GridBagLayout. По умолчанию компонент будет центрирован по горизонтали и вертикали в пределах GridBagLayout.

. Сделайте это следующим образом:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Login extends JFrame {
    int width = 600;
    int height = 900;

    JButton usernameTF = new JButton();

    void makeFrame() {
        this.setTitle("Login");
        this.setSize(width, height);
        this.setLocation(0, 0);
        this.setLayout(new GridBagLayout());
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().setBackground(new java.awt.Color(140, 156, 144));
        makeComponents();
        this.setVisible(true);
    }

    void makeComponents() {
        usernameTF.setSize(300, 75);
        this.add(usernameTF, new GridBagConstraints());
    }

    public static void main(String[] args) {
        Login l = new Login();
        l.makeFrame();
    }
}
...