我一直在为一个即将到来的项目使用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();
我试图设计一个弹出窗口。我设计了它,它的工作原理,但有一个小问题。这是弹出窗口代码的一部分: 这就是我所说的: 弹出窗口在应该工作的时候工作。但是其中的内容没有完全显示。这是屏幕截图: 如何解决这个问题?
问题内容: 这是一个非常简单的程序,我已尽力而为,但JPanel并未提供背景图片。我只希望面板上有一个简单的背景图像。 这是我的代码: 提前致谢 问题答案: 更换 与
问题内容: 将包含图形的添加到时,效果很好。但是,当我尝试添加 其中添加了其他图形的时,它不会显示在中。请参见下面的代码 问题答案: 请注意类的构造函数,使其成为您的习惯,以遵循本示例中所示的顺序。首先向中添加组件,然后再进行调用,例如 ,而不是在此之前。 始终把它当作习惯,每当您覆盖方法时,也要覆盖方法。 并始终像在EDT- 事件调度线程中那样发出呼叫。请阅读Swing中的Concurrency
我有一个扩展JFrame的类。它使用以下代码将180个图像加载到数组中 更新:我尝试使用一个JLabel而不是我的ImagePanel类。JLabel似乎也有同样的问题。当我使用JPEG时,它会显示,但当我使用PNG时,它什么也不显示。
问题内容: 在JPanel上显示jpg图像(从本地文件夹加载)的最合适的图像类型是什么? 干杯。 问题答案:
我知道同样的问题已经被问过很多次了,但是我似乎真的没有在我的代码中发现阻碍JPanel类型的对象显示在JFrame中的错误。下面是扩展JFrame的类的构造函数: 当我运行main方法(这里没有显示)时,它只显示框架和按钮。如果有人能在这方面给点提示,我会非常感谢的。