Исключение с JFreechart в JInternalFrame - PullRequest
2 голосов
/ 18 февраля 2012

По сути, я хочу 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, последняя версия).

1 Ответ

4 голосов
/ 18 февраля 2012

Вот упрощенная sscce , которая показывает, как JFreeChart может использоваться с JInternalFrame. Обратите внимание, что вы должны pack() (и, необязательно, размер) внутренней рамки, прежде чем сделать ее видимой. Соответствующий пример можно найти здесь .

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