2012-02-18 3 views
2

В принципе, я хочу графический интерфейс Java с несколькими кадрами, поэтому я использую JInternalFrame, но когда я добавляю свою диаграмму (созданную от JFreeChart) в один из фреймов, это дало мне исключение.Исключение с JFreechart в JInternalFrame

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

+0

Можете ли вы опубликовать код, в котором вы добавляете JFreeChart к JInternalFrame? Кроме того, какую версию Java вы используете? – ahawtho

+2

Вероятно, у вас есть ошибка в коде. Я думаю, что те из нас, у кого нет ESP, будут трудно угадать, что такое ошибка, не видя оскорбительного кода. –

ответ

4

Упрощенный sscce, который показывает, как JFreeChart может использоваться с JInternalFrame. Обратите внимание, что вы должны pack() (и необязательно размер) внутреннего кадра, прежде чем сделать его видимым. Соответствующий пример можно найти 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(); 
      } 
     }); 
    } 
} 
+0

Произошла такая же ошибка, хотя я следовал вашей идее. Ключевое слово: Исключение в потоке «AWT-EventQueue-0» java.lang.ClassCastException: javax.swing.plaf.ColorUIResource нельзя отнести к java.util.List ?? –

+0

Я не могу воспроизвести эту ошибку. Пожалуйста, отредактируйте свой вопрос, чтобы включить [sscce] (http://sscce.org/), который показывает проблему, которую вы описываете. Вы можете начать с моего примера _complete_. – trashgod

+0

Наконец-то это сработало, спасибо огромное! –

Смежные вопросы