我有同樣的問題,我設法解決這個問題是這樣的: (1)創建該擴展JPanel的自定義類 (2)得到的大小在某種程度上,你想傳遞給你的圖表 (3)創建它返回一個像這樣的「ChartPanel」對象的方法:
ChartPanel chart() {
//... custom code here
JFreeChart chart = ChartFactory.createPieChart(title, pieDataset, false, false, false);`enter code here`
// Now: this is the trick to manage setting the size of a chart into a panel!:
return new ChartPanel(chart) {
public Dimension getPreferredSize() {
return new Dimension(width, height);
}
};
}
我準備了SSCCE讓你知道它是如何工作的:
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
public class MyPieChart extends JPanel {
public static void main(String[] args) {
example1();
example2();
example3();
}
public static void example1() {
JPanel panel = new JPanel();
panel.setBounds(50, 80, 100, 100);
MyPieChart piePanel = new MyPieChart("Example 1", dataset(), panel);
panel.add(piePanel);
JFrame frame = new JFrame();
frame.setLayout(null);
frame.setBounds(10, 10, 200, 300);
frame.add(panel);
frame.setVisible(true);
}
public static void example2() {
MyPieChart piePanel = new MyPieChart("Example 2", dataset(), 30, 50, 100, 100);
JFrame frame = new JFrame();
frame.setLayout(null);
frame.setBounds(210, 10, 200, 300);
frame.add(piePanel);
frame.setVisible(true);
}
public static void example3() {
MyPieChart piePanel = new MyPieChart("Example 3", dataset(), 100, 100);
piePanel.setLocation(0,0);
JFrame frame = new JFrame();
frame.setLayout(null);
frame.setBounds(410, 10, 200, 300);
frame.add(piePanel);
frame.setVisible(true);
}
static ArrayList<ArrayList<String>> dataset() {
ArrayList<ArrayList<String>> dataset = new ArrayList<ArrayList<String>>();
dataset.add(row("Tom", "LoggedIn", "Spain"));
dataset.add(row("Jerry", "LoggedOut", "England"));
dataset.add(row("Gooffy", "LoggedOut", "France"));
return dataset;
}
static ArrayList<String> row(String name, String actualState, String country) {
ArrayList<String> row = new ArrayList<String>();
row.add(name); row.add(actualState); row.add(country);
return row;
}
ArrayList<ArrayList<String>> dataset;
DefaultPieDataset pieDataset = new DefaultPieDataset();
int width, height, posX, posY;
int colState = 1;
String title;
String LoggedIn = "LoggedIn";
String LoggedOut = "LoggedOut";
public MyPieChart(String title, ArrayList<ArrayList<String>> dataset, int...args) {
if(args.length==2) {
this.width = args[0];
this.height = args[1];
this.setSize(width, height);
}
else if(args.length==4) {
this.posX = args[0];
this.posY = args[1];
this.width = args[2];
this.height = args[3];
this.setBounds(posX, posY, width, height);
}
else {
System.err.println("Error: wrong number of size/position arguments");
return;
}
this.title = title;
this.dataset = dataset;
this.add(chart());
}
public MyPieChart(String title, ArrayList<ArrayList<String>> dataset, JPanel panel) {
this.title = title;
this.dataset = dataset;
this.width = panel.getWidth();
this.height = panel.getHeight();
this.setBounds(panel.getBounds());
this.add(chart());
}
ChartPanel chart() {
int totalLoggedIn = 0;
int totalLoggedOut = 0;
for(ArrayList<String> user : dataset) {
if(user.get(colState).equals(LoggedIn)) totalLoggedIn++;
else totalLoggedOut++;
}
pieDataset.clear();
pieDataset.setValue(LoggedIn +": "+ totalLoggedIn, totalLoggedIn);
pieDataset.setValue(LoggedOut +": "+ totalLoggedOut, totalLoggedOut);
JFreeChart chart = ChartFactory.createPieChart(title, pieDataset, false, false, false);
return new ChartPanel(chart) { // this is the trick to manage setting the size of a chart into a panel!
public Dimension getPreferredSize() {
return new Dimension(width, height);
}
};
}
}
我真的希望它有幫助!
也許content.pack()? – djb
*「我知道這個問題早已被問到,但提供的解決方案並不奏效。」*在哪裏?請鏈接.. –
究竟是什麼問題?調整內容大小時,是否希望chartPanel自動調整大小? –