当前位置: 首页 > 知识库问答 >
问题:

Java JFreeChart在JPanel中不能完全显示图表

钮鸿煊
2023-03-14

我一直在为一个即将到来的项目使用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();
            }
        }
    });
}
}

共有1个答案

田鹤轩
2023-03-14

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

chartPanel.repaint();
 类似资料:
  • 我试图设计一个弹出窗口。我设计了它,它的工作原理,但有一个小问题。这是弹出窗口代码的一部分: 这就是我所说的: 弹出窗口在应该工作的时候工作。但是其中的内容没有完全显示。这是屏幕截图: 如何解决这个问题?

  • 问题内容: 这是一个非常简单的程序,我已尽力而为,但JPanel并未提供背景图片。我只希望面板上有一个简单的背景图像。 这是我的代码: 提前致谢 问题答案: 更换 与

  • 问题内容: 将包含图形的添加到时,效果很好。但是,当我尝试添加 其中添加了其他图形的时,它不会显示在中。请参见下面的代码 问题答案: 请注意类的构造函数,使其成为您的习惯,以遵循本示例中所示的顺序。首先向中添加组件,然后再进行调用,例如 ,而不是在此之前。 始终把它当作习惯,每当您覆盖方法时,也要覆盖方法。 并始终像在EDT- 事件调度线程中那样发出呼叫。请阅读Swing中的Concurrency

  • 我有一个扩展JFrame的类。它使用以下代码将180个图像加载到数组中 更新:我尝试使用一个JLabel而不是我的ImagePanel类。JLabel似乎也有同样的问题。当我使用JPEG时,它会显示,但当我使用PNG时,它什么也不显示。

  • 问题内容: 在JPanel上显示jpg图像(从本地文件夹加载)的最合适的图像类型是什么? 干杯。 问题答案:

  • 我知道同样的问题已经被问过很多次了,但是我似乎真的没有在我的代码中发现阻碍JPanel类型的对象显示在JFrame中的错误。下面是扩展JFrame的类的构造函数: 当我运行main方法(这里没有显示)时,它只显示框架和按钮。如果有人能在这方面给点提示,我会非常感谢的。