как может появиться мой JPanel в моем JFrame? - PullRequest
0 голосов
/ 30 марта 2012

У меня проблема с моим JPanel, фактически мне не удалось заставить его появиться в моем JFrame, я создаю класс, который наследуется от JPanel (Graphique), и я должен вызвать его во втором классе, который наследует от JFrame ( testgraph1), но у меня были исключения вроде:

Исключение в потоке "AWT-EventQueue-0" java.lang.NullPointerException

вот мой код из класса, который наследует от JPanel:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

public class Graphique extends JPanel {

    private static final long serialVersionUID = 1L;

    /** titre : Le titre du graphique affiché en haut */
    private String titre;
    /** ordonnee : le nom de l'axe des ordonnées */
    private String ordonnee;
    /** abscisses : le nom de l'axe des abscisses */
    private String abscisse;
    /** valeurs : les valeurs à afficher, elles sont triées par séries et par catégories*/
    private List<Float> valeurs;
    /** series : la liste des séries */
    private List<String> series;
    /** categories : la liste des categories */
    private List<String> categories;
    /** legende : booleen vrai si on affiche la légende */
    private boolean legende;
    /** couleurFond : la couleur du fond */
    private Color couleurFond;
    /** couleurBarres : les couleurs appliquées aux barres */
    private Color[] couleursBarres = {Color.cyan.darker(), 
            Color.red, Color.green, Color.cyan, Color.magenta, 
            Color.yellow, Color.pink, Color.darkGray, Color.orange};

    /**
     * Constructeur
     * @param titre : le titre du graphique
     * @param abscisse : le nom de l'axe des abscisses
     * @param ordonnee : le nom de l'axe des ordonnées
     * @param valeurs : les valeurs
     * @param fond : la couleur de fond
     * @param listeSeries : les séries
     * @param listeCategory : les catégories
     * @param legende : vrai si on affiche la légende
     */

    public Graphique(String titre, String abscisse, String ordonnee, List<Float> valeurs, Color fond, List<String> listeSeries, List<String> listeCategory, boolean legende) {
        super(new GridLayout(1,0));
        this.titre=titre;
        this.ordonnee=ordonnee;
        this.abscisse=abscisse;
        this.valeurs=valeurs;
        this.series=listeSeries;
        this.categories=listeCategory;
        this.legende=legende;
        this.couleurFond=fond;
        initialiser();
    }

    /**
     * Initialise le graphique
     */
    private void initialiser(){
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        int k = 0;
        for ( int j=0; j<categories.size(); j++){
            for (int i=0; i<series.size(); i++){
                dataset.addValue(valeurs.get(k), series.get(i), categories.get(j));
                k++;
            }

        }
        JFreeChart chart = ChartFactory.createBarChart(
                titre,                      // chart title
                abscisse,                   // domain axis label
                ordonnee,                   // range axis label
                dataset,                    // data
                PlotOrientation.VERTICAL,   // orientation
                legende,                    // include legend
                true,                       // tooltips
                false                       // URL
        );

        // definition de la couleur de fond
        chart.setBackgroundPaint(couleurFond);

        CategoryPlot plot = (CategoryPlot) chart.getPlot();

        //valeur comprise entre 0 et 1 transparence de la zone graphique
        plot.setBackgroundAlpha(0.9f);

        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        renderer.setDrawBarOutline(false);

        // pour la couleur des barres pour chaque serie

        for (int s=0; s<series.size(); s++){
            GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, couleursBarres[s],
                    0.0f, 0.0f, new Color(0, 40, 70));
            renderer.setSeriesPaint(s, gp0);

        }       

        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setFillZoomRectangle(true);
        chartPanel.setMouseWheelEnabled(true);
        chartPanel.setPreferredSize(new Dimension(500, 270));

        add(chartPanel);
    }

    /**
     * Création d'un graphique
     * @param a
     */
    public static void main(String[] a){
        List<Float> donnees = new ArrayList<Float>();
        List<String> l1 = new ArrayList<String>();
        List<String> l2 = new ArrayList<String>();
        l2.add("0");
        l1.add("1");
        l1.add("2");
        l1.add("3");
        l1.add("4");
        donnees.add(2f);
        donnees.add(3f);
        donnees.add(4f);
        donnees.add(4f);
    }

}

и вот как я назвал класс Graphique из myJFrameclass testgraph1:

public static void main(String args[]) {

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {


            public void run() {

               JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setBounds(10,10,500,500);

               try{
                  Graphique  g = new Graphique("titre", "x", "y", donnees, Color.white, l2, l1, true);
                  f.add(g);
               }
        catch (Exception e){
                    e.printStackTrace();
                }
                f.setVisible(true);

            }
        });
    }

это исключения, которые у меня были:

java.lang.NullPointerException
    at Graphique.initialiser(Graphique.java:77)
    at Graphique.<init>(Graphique.java:68)
    at testgraph1$1.run(testgraph1.java:187)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:642)
    at java.awt.EventQueue.access$000(EventQueue.java:85)
    at java.awt.EventQueue$1.run(EventQueue.java:603)
    at java.awt.EventQueue$1.run(EventQueue.java:601)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:612)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Я не знаю, в чем проблема, спасибо за любую помощь

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Если вы посмотрите на ошибку, она говорит, что у вас есть нулевая ссылка на строку 77 класса Graphique.

Посмотрите на эту строку и отладьте ее, чтобы увидеть, какая у вас нулевая ссылка!

Я думаю, что это переменная серии в инициализаторе метода, которая является нулевой;)

Вывод: l2 является нулевым, когда вы создаете объект Graphisme.

0 голосов
/ 01 мая 2016

Этот сегмент кода ничего не делает, так как он просто создает список и ничего не делает со списками.

public static void main(String[] a){
        List<Float> donnees = new ArrayList<Float>();
        List<String> l1 = new ArrayList<String>();
        List<String> l2 = new ArrayList<String>();
        l2.add("0");
        l1.add("1");
        l1.add("2");
        l1.add("3");
        l1.add("4");
        donnees.add(2f);
        donnees.add(3f);
        donnees.add(4f);
        donnees.add(4f);
}

Таким образом, когда вы вызываете new graphisme, вышеприведенные три переменные равны нулю.

...