【问题标题】:How to automatically resize JFreeChart when window is resized调整窗口大小时如何自动调整JFreeChart的大小
【发布时间】:2019-07-03 14:17:28
【问题描述】:

我在ChartPanelJPanelJFrame 中有一个图表。我目前有BoxLayout 用于框架,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);

我尝试了here 的解决方案,但添加子面板对我没有任何帮助。我认为我不必为了调整图表大小而添加额外的面板。我怎样才能只使用chartPanelJPanelJFrame

【问题讨论】:

标签: java swing jpanel jfreechart chartpanel


【解决方案1】:

唯一可行的方法是将 JPanel 布局设置为 GridLayout,但我不能使用它,因为我在 JPanel 中有其他组件并且它使它们都具有相同的大小(我需要图表大于休息)。

然后为 JPanel 使用 GridLayout,或者可能更好,BorderLayout 并将其他组件放在一个新的 JPanel 中,一个使用 FlowLayout 的 JPanel,并将 that JPanel 添加到主 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());
    }
}

【讨论】:

  • 对不起,你是说我应该有类似的东西:frame > mainPanel(border) > chartPanel and otherPanel(flow)? chartPanel 和 otherPanel 是否在同一级别,或者它们是否以某种方式嵌套?
  • @TomK.:我不知道你在上面的评论中问的是什么,而且你没有在你的问题中显示相关代码让我的理解更加困难
  • 抱歉,您能简单演示一下嵌套面板的层次结构吗?
  • @TomK.:在您的问题中将代码显示为minimal reproducible example 总是更好,我们可以使用代码。请编辑您的问题并显示。请注意,您可以使用任何演示 JPanel 来代替图表面板(以防像我这样没有 JFreeChart 的人想要使用您的代码)
  • @TomK.:例如,我不知道您要创建哪种类型的 GUI。您声明某些组件不应该调整大小 - 那么哪些组件?他们应该是什么样子?等等……
猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 2011-02-28
  • 2019-05-15
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
相关资源
最近更新 更多