Почему некоторые свойства компонента в построенной JPanel выражены, но не другие? - PullRequest
0 голосов
/ 12 апреля 2020

Я начинаю программу, в которой я создаю JFrame и добавляю в него JPanel, используя другой класс, который я создал, под названием StartPanel. Когда JPanel создает, он добавляет JLabel, как определено в классе StartPanel. Затем эта панель добавляется в JFrame. Некоторые свойства метки выражены в GUI (она добавляет себя на панель, может добавить красную рамку через нее, может изменить текст), но некоторые - нет. Например, я не могу изменить местоположение или размер этикетки.

Все, что я прочитал о проблеме до сих пор (я думаю), согласилось с моим подходом или не разъяснило многое. Кроме того, я добавил границы как в StartPanel, так и в метку, чтобы визуализировать проблему и убедиться, что метка не меняет свой размер. Я не могу настроить ни размер, ни расположение метки. Как я могу решить эту проблему и контролировать свойства метки?

Кроме того, я понимаю, что мог бы обойти всю проблему, не создавая панель через отдельный класс и объявив метку в той же функции. Тем не менее, этот проект будет довольно большим, поэтому я бы предпочел иметь систему классов, в которой я могу создать панель по мере необходимости.

Кодовое время:

Где я создаю фрейм и Панель с использованием класса:

public class StartFrame {

    public StartFrame() {
        JFrame frame = new JFrame("Constuctor tests");
        frame.setSize(800, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        JPanel startPanel = new StartPanel();  //This is where I construct the panel
        startPanel.setVisible(true);
        startPanel.setBorder(BorderFactory.createLineBorder(Color.blue)); //Visualize the panel
        frame.add(startPanel);

    }

}

Класс StartPanel:

public class StartPanel extends JPanel {

    public StartPanel() {
        JLabel label = new JLabel("This is a label");
        label.setLocation(100, 100); //It is not at 100,100
        label.setSize(200, 100); //It is not a box this large
        label.setBorder(BorderFactory.createLineBorder(Color.red)); //Done as to visualize it
        label.setVisible(true);
        add(label);

    }
}

Наконец, изображение продукта: Конечный продукт

Большое спасибо за вашу помощь!

1 Ответ

1 голос
/ 12 апреля 2020

Вы можете контролировать размер и расположение элементов с помощью менеджеров по расположению. Вы можете прочитать все об этом здесь .

Для начала давайте посмотрим, почему ваш экран выглядит так.

Макет JFrame по умолчанию - BorderLayout. BorderLayout берет своего первого дочернего элемента (в данном случае JPanel), размещает его в центре и растягивает, чтобы он занимал всю ширину контейнера (в данном случае JFrame). Вот почему ваша StartPanel занимает полный размер JFrame. Здесь вы можете прочитать больше о том, как использовать макет границы.

Макетом по умолчанию для JPanel является FlowLayout. В макете потока каждый дочерний элемент (в данном случае JLabel) добавляется к центральной вершине. Когда добавляется больше детей, они добавляются рядом друг с другом в одной строке. FlowLayout позволяет его дочерним элементам принимать размер, который они хотят. В этом случае JLable нужен только маленький прямоугольник, чтобы показать текст, так что это будет размер JLabel. Go здесь, чтобы узнать больше о FlowLayout.

...