Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
139 views
in Technique[技术] by (71.8m points)

java - Exception with JFreechart in JInternalFrame

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) ....

This is the code :

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);
            }
        }
    }
}

How could I handle them? Thanks. (I'm using Eclipse, latest version).

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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.

enter image description 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();
            }
        });
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...