Проблемы с макетом Java - PullRequest
1 голос
/ 20 февраля 2009

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

    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% пространства в верхней части кадра.

Ответы [ 6 ]

4 голосов
/ 21 февраля 2009

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

Это:

JPanel buttonPanel = new JPanel();

Должно быть:

JPanel buttonPanel = new JPanel(new BorderLayout());
2 голосов
/ 20 февраля 2009

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

также:

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

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

0 голосов
/ 24 февраля 2009

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

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

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

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

http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/

Наслаждайтесь!

0 голосов
/ 21 февраля 2009

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

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

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

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

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

0 голосов
/ 20 февраля 2009

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

0 голосов
/ 20 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...