JInternalFrame中的JFreechartexception

基本上,我想要一个具有多个框架的Java GUI,所以我使用JInternalFrame ,但是当我将我的图表(从JFreeChart创建)添加到其中一个框架时,它给了我一个例外。

 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,最新版本)。

这是一个简化的sscce ,它显示了JFreeChart如何与JInternalFrame一起使用。 请注意,在使内部框架可见之前,应该对其进行pack() (并可选择resize)。 可在此处找到相关示例。

在此处输入图像描述

 /** @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(); } }); } }