gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:55:25 25 4
gpt4 key购买 nike

我一直在为一个即将到来的项目试验 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com