簡體   English   中英

調整窗口大小時如何自動調整JFreeChart的大小

[英]How to automatically resize JFreeChart when window is resized

我在JFrame內的JPanel內的ChartPanel內有一個圖表。 我目前有BoxLayou t的框架和FlowLayoutJPanel 我想讓圖表在調整窗口大小時自動調整大小。 我已經嘗試了在這里找到的所有解決方案,唯一GridLayout是將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);

我在這里嘗試過該解決方案但是添加子面板對我沒有任何幫助。 我認為不必為了使圖表調整大小而添加額外的面板。 我該如何僅使用chartPanelJPanelJFrame呢?

唯一有效的方法是將JPanel布局設置為GridLayout,但我不能使用它,因為JPanel中有其他組件,並且它們的大小都相同(我需要圖表比其余的更大)。

然后使用網格布局,或者更好, BorderLayout對JPanel並放置一個新JPanel中的其他組件,一個使用,說的FlowLayout,並添加的JPanel的主要原因之一。 Nest JPanels,每個都使用各自的布局來實現最靈活的GUI和設計。

我認為不必為了使圖表調整大小而添加額外的面板。

是的你是。

我有圖表和一堆按鈕(圖表下方),這些按鈕可讓用戶與圖表進行交互。 顯然,我不希望按鈕與圖表本身一樣大。 當前,所有按鈕和chartPanel都位於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());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM