问题描述
基本上,我想要一个具有多个框架的Java GUI,所以我使用 JInternalFrame
,但是当我添加我的图表时(从 JFreeChart创建)
)其中一个框架,它给了我一个例外。
Basically, I want a Java GUI with multiple frames, so I'm using JInternalFrame
, but when I add my chart (created from JFreeChart
) to one of the frames, it gave me an exception.
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.plaf.ColorUIResource cannot be cast to java.util.List
at javax.swing.plaf.metal.MetalUtils.drawGradient(Unknown Source)
at javax.swing.plaf.metal.MetalInternalFrameTitlePane.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source) ....
这是代码:
public class immobile extends JFrame {
JDesktopPane desktop;
public immobile() {
desktop = new JDesktopPane();
desktop.setDesktopManager(new No1DragDesktopManager());
getContentPane().add(desktop);
desktop.add(createInternalFrame(30, 50, Color.WHITE));
desktop.add(createInternalFrame(30, 360, Color.WHITE));
desktop.add(createInternalFrame(630, 50, Color.WHITE));
desktop.add(createInternalFrame(630, 360, Color.WHITE));
}
private JInternalFrame createInternalFrame(
int location1, int location2, Color background) {
JInternalFrame internal =
new JInternalFrame("Frame" + location1, true, true, true, true);
internal.setBackground(background);
internal.setVisible(true);
internal.setResizable(false);
internal.setBounds(location1, location2, 600, 310);
internal.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
return internal;
}
public static void main(String args[]) {
immobile frame = new immobile();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(1280, 720);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setResizable(false);
try {
JInternalFrame[] frames = frame.desktop.getAllFrames();
JInternalFrame f = frames[0];
String url = "http://www.cophieu68.com/export/excel.php?id=ABT";
//create the chart from JFreechart//
JFreeChart chart = garch_project.garch_chart(url);
JPanel chartPanel = new ChartPanel(chart);
f.add(chartPanel);
f.putClientProperty("dragMode", "fixed");
JInternalFrame f3 = frames[2];
f3.putClientProperty("dragMode", "fixed");
JInternalFrame f4 = frames[1];
f4.putClientProperty("dragMode", "fixed");
JInternalFrame f2 = frames[3];
f2.putClientProperty("dragMode", "fixed");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class No1DragDesktopManager extends DefaultDesktopManager {
public void beginDraggingFrame(JComponent f) {
if (!"fixed".equals(f.getClientProperty("dragMode"))) {
super.beginDraggingFrame(f);
}
}
public void dragFrame(JComponent f, int newX, int newY) {
if (!"fixed".equals(f.getClientProperty("dragMode"))) {
super.dragFrame(f, newX, newY);
}
}
public void endDraggingFrame(JComponent f) {
if (!"fixed".equals(f.getClientProperty("dragMode"))) {
super.endDraggingFrame(f);
}
}
}
}
如何我可以处理它们吗?谢谢。 (我正在使用Eclipse,最新版本。)
How could I handle them? Thanks. (I'm using Eclipse, latest version).
推荐答案
这是一个简化的,显示 JFreeChart
如何与 JInternalFrame
一起使用。请注意,在使内部框架可见之前,您应该 pack()
(并可选择调整大小)。可以在找到相关示例。
Here's a simplified sscce that shows how JFreeChart
may be used with JInternalFrame
. Note that you should pack()
(and optionally size) the internal frame before making it visible. A related example may be found here.
/** @see https://stackoverflow.com/questions/9338466 */
public class InternalFreeChart {
private static final Random rnd = new Random();
public InternalFreeChart() {
JFrame frame = new JFrame();
JDesktopPane desktop = new JDesktopPane();
frame.add(desktop);
for (int i = 1; i < 9; i++) {
desktop.add(createInternalFrame(i));
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setSize(640, 480);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private JInternalFrame createInternalFrame(int n) {
JInternalFrame jif = new JInternalFrame(
"Frame" + n, true, true, true, true);
jif.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"Test", "Time", "Value", createDataset(), true, true, false);
JPanel chartPanel = new ChartPanel(chart);
jif.add(chartPanel);
jif.pack();
jif.setBounds(n * 25, n * 20, 400, 300);
jif.setVisible(true);
return jif;
}
private static XYDataset createDataset() {
TimeSeries series1 = new TimeSeries("Series 1");
TimeSeries series2 = new TimeSeries("Series 2");
SerialDate sd = SerialDate.createInstance(new Date());
for (int i = 1; i < 16; i++) {
Day d = new Day(SerialDate.addDays(i, sd));
series1.add(d, 100 + rnd.nextGaussian() / 2);
series2.add(d, 101 + rnd.nextGaussian() / 2);
}
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(series1);
dataset.addSeries(series2);
return dataset;
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
InternalFreeChart ifc = new InternalFreeChart();
}
});
}
}
这篇关于JInternalFrame中的JFreechart异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!