Ява использовать размер JPanel для размера компонентов - PullRequest
2 голосов
/ 24 июня 2011

Можно ли использовать размер JPanel для установки размера компонентов внутри JPanel? Когда я пытаюсь использовать getHeight () или getWidth () в JPanel, он всегда возвращает 0. Я знаю, что он получает свой размер после упаковки JFrame, но как можно использовать размеры JPanel и применить его к компонент внутри него? Как то так

JPanel panel = new JPanel();
JLabel label = new JLabel();
label.setWidth(panel.getWidth());
panel.add(label);

EDIT: Смотрите пример кода ниже. Что мне делать, если я хочу, чтобы мой Jlabel был таким же широким, как и мой JPanel? В этом случае неправильно использовать boxlayout?

public class Main extends JFrame{

public Main(){
    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
    panel.setBorder(BorderFactory.createLineBorder(Color.blue));

    JLabel label = new JLabel();
    label.setBorder(BorderFactory.createLineBorder(Color.red));
    label.setText("label1");
    label.setMinimumSize(panel.getPreferredSize());
    label.setPreferredSize(panel.getPreferredSize());
    panel.add(label);


    add(panel);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
    setSize(500,500);
    setVisible(true);
}

public static void main(String[] args)
{
    new Main();
}

}

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

Можно ли использовать размер JPanel для установки размера компонентов внутри JPanel?

Это работа менеджера по расположению.

Когда я пытаюсь использовать getHeight () или getWidth () на JPanel, он всегда возвращает 0

При вызове менеджера макета контейнер будет иметь действительный размер, чтобы менеджер макета мог правильно выполнять свою работу.

У вас нет причин играть с размерами. Предоставьте менеджерам верстки выполнять их работу.

Обновление:

Что мне делать, если я хочу, чтобы мой Jlabel был таким же широким, как мой JPanel? В этом случае неправильно использовать boxlayout?

BoxLayout пытается соблюдать минимальный / максимальный размер компонента. В вашем случае вы должны быть в состоянии сделать что-то вроде:

JLabel label new JLabel("some text");
label.setBorder(....);
Dimension d = label.getPreferredSize();
d.width = 32767;
label.setMaximumSize( d );

Или, возможно, более простой подход - начать с BorderLayout. Вы можете добавить ярлык к СЕВЕРУ. Затем создайте другую панель и добавьте ее в ЦЕНТР.

1 голос
/ 24 июня 2011

Конечно, вы можете, но будьте осторожны, так как результат зависит от менеджера компоновки вашего JPanel и от числа его дочерних компонентов.

0 голосов
/ 24 июня 2011

Настройка ширины игнорирует изменение размера. Менеджеры LayoutManager обычно запрашивают у компонентов их предпочтительную ширину и высоту и расширяют / сжимают элементы, чтобы сохранить визуально привлекательную позицию после изменения размера кадра. Поэтому лучше всего использовать менеджер макетов и указать «предпочтительную ширину».

Вы можете использовать setPreferredWidth(...); но, если вы предпочитаете менять ширину во время выполнения программы (из-за изменения размера окна), вам нужно будет прослушать соответствующую панель и обновить предпочитаемую ширину вашей кнопки по мере изменения предпочтительной ширины панели (это предполагает, что она изменяется , что не может быть правдой).

...