Проблемы с компоновкой графического интерфейса Java

Я пишу небольшую программу с графическим интерфейсом Java, и у меня возникают некоторые проблемы с тем, что Java не выкладывает вещи должным образом. В последнее время я не делал много кода Java GUI, поэтому мне трудно понять, в чем проблема.

    final JFreeChart chart = createChart(dataset);
    final ChartPanel chartPanel = new ChartPanel(chart, false);
    chartPanel.setPreferredSize(new Dimension(500, 270));
    JPanel buttonPanel = new JPanel();
    buttonPanel.setPreferredSize(new Dimension(500,50));

    JButton toggleButton = new JButton("Toggle");
    final JTextField minRange = new JTextField("10");
    final JTextField maxRange = new JTextField("1000");
    JButton setLimits = new JButton("Set Limits");

    buttonPanel.add(toggleButton, BorderLayout.NORTH);
    buttonPanel.add(minRange, BorderLayout.SOUTH);
    buttonPanel.add(maxRange, BorderLayout.SOUTH);
    buttonPanel.add(setLimits);

JSplitPane jsp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, chartPanel, buttonPanel);
jsp.setDividerLocation(0.8);
setContentPane(jsp);

Здесь происходит то, что все параметры макета полностью игнорируются. Компоненты графического интерфейса отображаются правильно, и разделитель, в частности, игнорирует предпочтительный размер JFreeChart и сжимает его примерно до 5% пространства в верхней части кадра.


person Community    schedule 20.02.2009    source источник


Ответы (6)


В дополнение к проблемам с разделенной панелью, не учитывающей желаемые размеры, вы используете константы BorderLayout, но не указали макет для панели (по умолчанию используется FlowLayout).

Этот:

JPanel buttonPanel = new JPanel();

Должно быть:

JPanel buttonPanel = new JPanel(new BorderLayout());
person Dan Dyer    schedule 20.02.2009

Я считаю, что использование плавающей пропорции в JSplitPane работает только после того, как разделенная панель «реализована», в противном случае вы получаете нулевую пропорцию, потому что она не знает, насколько большой она будет.

также:

buttonPanel.add(minRange, BorderLayout.SOUTH);
buttonPanel.add(maxRange, BorderLayout.SOUTH);

BorderLayout позволяет размещать только один компонент в каждой области, поэтому минимальный диапазон никогда не появится, так как maxRange теперь является «южным» компонентом. если вы хотите оба, вам нужно поместить эти 2 компонента в другую панель, а затем добавить эту панель на юг.

person John Gardner    schedule 20.02.2009

Попробуйте также установить минимальный размер.

См.: проблемы с графическим интерфейсом Java

person OscarRyz    schedule 20.02.2009
comment
Да, оказывается, это почти дубликат. Должны ли мы сделать тег jsplitpane, чтобы этот вопрос больше не возникал? - person Michael Myers; 20.02.2009
comment
Действительно? Наверное, надо :) - person OscarRyz; 21.02.2009

JSplitPane обращает внимание на минимальный размер, а не на предпочтительный размер. Попробуйте просто изменить setPreferredSize на setMinumumSize.

person Michael Myers    schedule 20.02.2009

Дэн Дайер прав, вы не устанавливали макет.

Вы также можете установить его с помощью buttonPanel.setLayout(new BorderLayout())

И Джон Гарднер прав, что вы дважды устанавливаете компонент в BorderLayout.SOUTH.

Также проверьте MigLayout, если вы еще не знаете об этом. Это наименее «удивительный» менеджер компоновки, который я когда-либо использовал. Это просто работает. Это требует некоторого обучения, но очень прямолинейно, как только вы разберетесь с синтаксисом.

И я бы избегал SplitPane, если можно... это очень привередливо

person Pyrolistical    schedule 20.02.2009

Никогда не вызывайте setPreferredSize() — это должен быть расчет.

Например, для вашей ButtonPanel устанавливается фиксированный предпочтительный размер.

Что, если вы добавите поддержку I18N, а пользователь использует язык с очень длинными локализациями? Что, если пользователь изменит размер кадра?

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

http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/< /а>

Наслаждаться!

person Scott Stanchfield    schedule 24.02.2009