调整窗口大小时如何自动调整 JFreeChart 的大小

汤姆·沙莫夫

我在 a ChartPanelinside a JPanelinside a 中有一个图表JFrame我公司目前拥有BoxLayou吨的框架,并FlowLayoutJPanel我想让图表在调整窗口大小时自动调整大小。我已经尝试了我在这里找到的所有解决方案,唯一有效的方法是将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,JPanelJFrame

充满鳗鱼的气垫船

唯一有效的方法是将 JPanel 布局设置为 GridLayout,但我无法使用它,因为我在 JPanel 中有其他组件,并且它使它们的大小都相同(我需要图表比其余部分大)。

然后BorderLayout对 JPanel使用 GridLayout,或者也许更好,并将其他组件放置在一个新的 JPanel 中,一个使用,比如说 FlowLayout,并将JPanel添加到主要的 JPanel。嵌套 JPanel,每个都使用自己的布局来实现最灵活的 GUI 和设计。

我认为我不必为了调整图表大小而添加额外的面板。

是的你是。

我有图表和一堆按钮(在图表下方),让用户与图表进行交互。显然,我不希望按钮和图表本身一样大。目前所有按钮和图表面板都在 mainPanel 内。

然后使用 BorderLayout,将图表放置在 BorderLayout.CENTER 位置,并将按钮放入位于 BorderLayout.PAGE_END 位置的 JPanel,如果需要,可以使用默认 FlowLayout,或任何其他效果最佳的布局。

例如:

在此处输入图片说明

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());
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章