Java JFreeChart 未在 JPanel 中完全显示图表

标签 java swing jpanel jfreechart pie-chart

我一直在为一个即将到来的项目试验 JFreeChart,并查看了它们似乎非常简单的教程。我创建了一个简单的小程序来请求一些数据并显示 3D 饼图。它有效,但在面板中显示图表时,它仅部分显示图表。如果您在面板内部单击,它将增长到显示面板的大小。我试过在不同的地方设置各种 setPreferredSize() 但似乎都不起作用。我错过了什么?

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.Rectangle;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JLabel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.JButton;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.util.Rotation;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import net.miginfocom.swing.MigLayout;


@SuppressWarnings("serial")
public class mWindow extends JFrame{

private JPanel pnlDisplay;
private JPanel panel;
private JLabel label_1;
private JLabel label_2;
private JSpinner spinner;
private JButton button;


/**
 *  Window Constructor
 */
private mWindow(){
    setBounds(new Rectangle(0, 0, 600, 500));
    getContentPane().setLayout(new MigLayout("", "[200px:200.00][564px,grow]", "[120px:120.00][308px,grow]"));

    panel = new JPanel();
    panel.setLayout(null);
    panel.setBorder(new EtchedBorder(EtchedBorder.RAISED, null, null));
    getContentPane().add(panel, "cell 0 0,grow");

    label_1 = new JLabel("Control Panel");
    label_1.setBounds(10, 10, 100, 20);
    panel.add(label_1);

    label_2 = new JLabel("Number of Values");
    label_2.setBounds(10, 40, 100, 20);
    panel.add(label_2);

    spinner = new JSpinner();
    spinner.setBounds(120, 40, 40, 20);
    panel.add(spinner);

    button = new JButton("Create Pie Chart");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            createPieChart();
        }
    });
    button.setBounds(10, 70, 150, 40);
    panel.add(button);

    pnlDisplay = new JPanel();
    pnlDisplay.setBorder(new EtchedBorder(EtchedBorder.RAISED, null, null));
    getContentPane().add(pnlDisplay, "cell 0 1 2 1,grow");
    pnlDisplay.setLayout(null);

}

private void createPieChart(){

    //  create the data set
    //  create the chart
    //  put chart in a panel
    //  set default configuration for panel
    //  add panel to our displayPanel

    int numVal = (int) spinner.getValue();
    JTextField label = new JTextField();
    JTextField value = new JTextField();        
    DefaultPieDataset dds = new DefaultPieDataset();

    final JComponent[] fieldInput = new JComponent[]{
            new JLabel("Label Name"), label,
            new JLabel("Value"), value
    };

    for(int index = 0; index < numVal; index++){
        // Display a dialog asking for the Information Needed to add a job
        int n = JOptionPane.showConfirmDialog(
                this, 
                fieldInput, 
                "Create Data Set " + (index+1), 
                JOptionPane.PLAIN_MESSAGE
        ); 

        if(n < 0){
            JOptionPane.showMessageDialog(this, "No Data Set has been created", 
                    "Data Set Add Canceled ", JOptionPane.ERROR_MESSAGE);
            return;
        } 

        String Label = label.getText();
        int Value = Integer.parseInt(value.getText());
        dds.setValue(Label, Value);
        label.setText("");
        value.setText("");
    }

    // Data set ready ~ create the chart
    JFreeChart chart = ChartFactory.createPieChart3D("Our Pie Chart",          // chart title
            dds,                // data set
            true,               // include legend
            true,               // enable tool tips
            false);             // use urls

    PiePlot3D plot = (PiePlot3D) chart.getPlot();
    plot.setStartAngle(290);                        // angel of first data set
    plot.setDirection(Rotation.CLOCKWISE);          // rotation of chart
    plot.setForegroundAlpha(0.2f);                  // set alpha transparency

    // create a panel to track chart changes and set it's default size
    final ChartPanel chartPanel = new ChartPanel(chart);
    chartPanel.setPreferredSize(pnlDisplay.getSize());


    chartPanel.setBounds(10,10,pnlDisplay.getWidth()-20,pnlDisplay.getHeight()-20);

    // add our chart to our display panel
    pnlDisplay.add(chartPanel);
    pnlDisplay.validate();

}

/**
 *  Initializes and Show the GUI
 */
private static void InitalizeAndShowGUI(){
    mWindow mainWindow = new mWindow();
    mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainWindow.setTitle("Chart Demo v0.1");
    Dimension windowSize = new Dimension(600,700);
    mainWindow.setMinimumSize(windowSize);
    mainWindow.setLocation(100, 100);
    mainWindow.pack();
    mainWindow.setVisible(true);
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                InitalizeAndShowGUI();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
}

最佳答案

添加新的图表组件后,需要重新绘制,使其完整显示:

chartPanel.repaint();

关于Java JFreeChart 未在 JPanel 中完全显示图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12342688/

相关文章:

java - 获取放置在不同组件中的按钮的 Action 事件

java - 我从 "Scanner"的输入没有被记录?什么都不返回

Java 内部类的类型捕获

java - 重新绘制图形问题

java - 使用不支持 HTML 格式的不同样式重写 JButton PaintComponent

java - 动态改变JBouton的位置

java - 向 JPanel 添加其他 JPanel

java - 将参数传递给 Bamboo 中的构建

java - 使用 Java,我需要将一个字符串拆分成两个大写字母之间的 arrayList

java - 如何修复我的文本字段,使其不与旁边的面板重叠?