2012-02-18 3 views
2

Fondamentalement, je veux une interface graphique Java avec plusieurs cadres, donc j'utilise JInternalFrame, mais quand j'ajoute mon tableau (créé à partir de JFreeChart) à l'un des cadres, il m'a donné une exception.Exception avec JFreechart dans 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) .... 

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

Comment pourrais-je les gérer? Merci. (J'utilise Eclipse, dernière version).

+0

Pouvez-vous s'il vous plaît poster le code où vous ajoutez le JFreeChart au JInternalFrame? De plus, quelle version de Java utilisez-vous? – ahawtho

+2

Vous avez probablement un bug dans votre code. Je pense que ceux d'entre nous sans ESP auront du mal à deviner ce qu'est le bug sans voir le code incriminé. –

Répondre

4

Voici un sscce simplifié qui montre comment JFreeChart peut être utilisé avec JInternalFrame. Notez que vous devez pack() (et éventuellement dimensionner) le cadre interne avant de le rendre visible. Un exemple associé peut être trouvé 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

La même erreur s'est produite bien que je suivais votre idée. Le mot clé était: Exception dans le fil "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.plaf.ColorUIResource ne peut pas être converti en java.util.List ?? –

+0

Je n'arrive pas à reproduire cette erreur. Veuillez modifier votre question pour inclure un [sscce] (http://sscce.org/) qui présente le problème que vous décrivez. Vous pouvez commencer avec mon exemple _complete_. – trashgod

+0

Enfin ça a marché, merci beaucoup! –