Почему эта JPanel не придерживается указанного размера? - PullRequest
3 голосов
/ 08 октября 2010

Итак, я пытаюсь изучить Java Swing и пользовательские компоненты. Я создал JFrame, присвоил ему цвет фона и добавил JPanel:

    JFrame frame = new JFrame("Testing");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(1000, 2000);
    frame.setBackground(Color.WHITE);

    JPanel jp = new JPanel();
    jp.setBackground(Color.BLUE);
    jp.setSize(40, 40);
    frame.add(jp);

    frame.setVisible(true);

В результате получается окно 1000x2000 синего цвета (в отличие от белого окна с синей рамкой 40x40 внутри). Почему JPanel расширяется за пределы указанного размера?

Ответы [ 2 ]

2 голосов
/ 08 октября 2010

Используя ваш код, просто добавьте одну строку, чтобы изменить LayoutManager из JFrame. Затем, когда вы добавите компонент, он сохранит свой предпочтительный размер.

Кроме того, вместо вызова jp.setSize(40,40), вызовите jp.setPreferredSize (new Dimension (40,40)).

И вам нужно позвонить pack() на JFrame, чтобы сообщить ему о расположении его компонентов.

JFrame frame = new JFrame("Testing");
frame.setLayout(new FlowLayout()); // New line of code
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(1000, 2000));  // Modified line of code
frame.setBackground(Color.WHITE);

JPanel jp = new JPanel();
jp.setBackground(Color.BLUE);
jp.setPreferredSize(new Dimension(40, 40)); // Modified line of code
frame.add(jp);

frame.pack(); // added line of code
frame.setVisible(true);

Кроме того, вам следует ознакомиться со всеми доступными вам LayoutManagers. Здесь - отличный учебник.

2 голосов
/ 08 октября 2010

Менеджер по умолчанию для JFrame: BorderLayout. Когда вы добавляете компонент к фрейму без ограничений, он использует BorderLayout.CENTER в качестве ограничения по умолчанию. Это означает, что компонент занимает все доступное пространство, независимо от его запрошенного размера.

...