Невозможно выровнять компонент JLabel в JPanel слева от JPanel, в которой он находится

Независимо от того, как я установил свои границы для моего JLabel, он всегда в одном месте. Я использую окно приложения Window Builder Swing Designer. Вот мой код:

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
import java.awt.Color;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.SwingConstants;

public class Restaurants {

private JFrame frame;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Restaurants window = new Restaurants();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
     public Restaurants() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(0, 0, 1368, 689);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    JPanel panel = new JPanel();
    panel.setBorder(new LineBorder(new Color(0, 0, 0), 12));
    panel.setBounds(10, 143, 572, 258);
    frame.getContentPane().add(panel);

    JLabel label= new JLabel("Chicken Burger Meal");
    label.setFont(new Font("Tahoma", Font.PLAIN, 18));
    label.setBounds(21,70,173,29);
    panel.add(label);

    JLabel lblChickenBurger = new JLabel("Chicken Burger");
    lblChickenBurger.setFont(new Font("Tahoma", Font.PLAIN, 18));
    lblChickenBurger.setBounds(21,22,173,29);
    panel.add(lblChickenBurger);

    JPanel panel_1 = new JPanel();
    panel_1.setBorder(new LineBorder(new Color(0, 0, 0), 12));
    panel_1.setBounds(592, 143, 401, 259);
    frame.getContentPane().add(panel_1);

    JPanel panel_2=new JPanel();
    panel_2.setBorder(new LineBorder(new Color(0,0,0), 12));
    panel_2.setBounds(10,412,572,228);
    frame.getContentPane().add(panel_2);

    JPanel panel_3=new JPanel();
    panel_3.setBorder(new LineBorder(new Color(0,0,0),12));
    panel_3.setBounds(592,411,401,228);
    frame.getContentPane().add(panel_3);

    JPanel panel_4 = new JPanel();
    panel_4.setBorder(new LineBorder(new Color(0, 0, 0), 12));
    panel_4.setBounds(1003, 174, 401, 465);
    frame.getContentPane().add(panel_4);

    JLabel lblNewLabel = new JLabel("Loan Management System");
    lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 60));
    lblNewLabel.setBounds(160, 49, 849, 96);
    frame.getContentPane().add(lblNewLabel);
}

}

Что вы думаете не так? Я перебрал все возможные стратегии, о которых только мог придумать, но, похоже, ни одна из стратегий не дает какого-либо жизнеспособного решения.

2 ответа

Самый простой и подходящий способ - НЕ использовать абсолютное позиционирование - используйте соответствующие менеджеры компоновки. Попытка использовать абсолютное позиционирование чревата проблемами, особенно если вы портируете на другую платформу с другим размером экрана, размером в пикселях, шрифтом по умолчанию или любым другим. И изменение шрифта или строк метки, или добавление / удаление компонентов, будет кошмаром.

JPanel itsepf не обращает никакого внимания на размер компонента (x,y) - для этого он использует менеджер компоновки.

Если вы настаиваете на том, чтобы делать это с нулевым макетом, вам придется создать свой собственный подкласс JPanel с помощью нулевого менеджера макетов, а в методе paintComponent() разместить компоненты самостоятельно (или, наоборот, написать собственный LayoutManager для этого).

Изменение аргументов, переданных в setBounds() метод, кажется, работает для меня с вашим кодом. В частности, какой JPanel вы пытаетесь переместить?

Я бы попробовал посмотреть в менеджере макета GridLayout, что вы пытаетесь сделать: https://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html

Другие вопросы по тегам