Как автоматически изменить размер JFreeChart при изменении размера окна - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть диаграмма внутри ChartPanel внутри JPanel внутри JFrame.В настоящее время у меня есть BoxLayou т для кадра и FlowLayout для JPanel.Я хочу, чтобы график изменял размеры автоматически при изменении размера окна.Я перепробовал все решения, которые нашел здесь, и единственное, что сработало, это установить макет JPanel на GridLayout, но я не могу его использовать, потому что у меня есть другие компоненты в JPanel, и он делает ихвсе одинакового размера (мне нужно, чтобы диаграмма была больше, чем остальные).

В настоящее время у меня есть:

chartPanel.setPreferredSize(new java.awt.Dimension(500, 250));

frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
mainPanel = new JPanel(new FlowLayout());
mainPanel.setPreferredSize(new Dimension(500, 500));
mainPanel.add(chartPanel);

frame.add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

Я пробовал решение здесь , нодобавление подпанели ничего не сделало для меня.Я не думаю, что мне придется добавлять дополнительные панели только для изменения размера диаграммы.Как я могу сделать это только с chartPanel, JPanel и JFrame?

1 Ответ

0 голосов
/ 09 февраля 2019

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

Затем используйте GridLayout или, возможно, лучше, BorderLayout для JPanel и поместите другие компоненты в новую JPanel, которая использует, скажем, FlowLayout, и добавьте что JPanel к основному.Вложите JPanels, каждая из которых использует свои собственные макеты для создания максимально гибкого графического интерфейса и дизайна.

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

Да, вы делаете.

У меня есть график и несколько кнопок (под графиком), которые позволяют пользователю взаимодействовать с графиком.Очевидно, я не хочу, чтобы кнопки были такими большими, как сама диаграмма.В настоящее время все кнопки и chartPanel находятся внутри mainPanel.

Затем используйте BorderLayout, поместите диаграмму в позицию BorderLayout.CENTER и кнопки в JPanel, который находится в позиции BorderLayout.PAGE_END, которая используетпо умолчанию FlowLayout, если необходимо, или любой другой макет, который работает лучше всего.

Например:

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.*;
import javax.swing.border.Border;

public class ChartAndButtons extends JPanel {
    private static final long serialVersionUID = 1L;

    public ChartAndButtons() {
        JPanel mockChartPanel = createMockChart();
        int gap = 3;
        JPanel buttonPanel = new JPanel(new GridLayout(1, 0, gap, gap));
        buttonPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
        String[] buttonNames = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
        for (String buttonName : buttonNames) {
            buttonPanel.add(new JButton(buttonName));
        }

        setLayout(new BorderLayout());
        add(mockChartPanel, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.PAGE_END);
    }

    // ignore this -- it simply creates a JPanel as a placeholder
    // for your real JFreeChart panel   
    private JPanel createMockChart() {
        JLabel label = new JLabel("Mock Chart");
        label.setFont(label.getFont().deriveFont(Font.BOLD, 60f));
        Color color = Color.ORANGE;
        JPanel mockChartPanel = new JPanel(new GridBagLayout());
        mockChartPanel.add(label);
        Border outsideBorder = BorderFactory.createLineBorder(color, 40);
        int eb = 80;
        Border insideBorder = BorderFactory.createEmptyBorder(eb, eb, eb, eb);
        mockChartPanel.setBorder(BorderFactory.createCompoundBorder(outsideBorder, insideBorder));
        mockChartPanel.setBackground(color.brighter());

        return mockChartPanel;
    }

    private static void createAndShowGui() {
        ChartAndButtons mainPanel = new ChartAndButtons();

        JFrame frame = new JFrame("ChartAndButtons");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
...