怎么能在我的JFrame中出现我的JPanel?

时间:2012-03-30 14:27:49

标签: java swing jframe jpanel

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

}

这就是我从myJFrameclass testgraph1调用Graphique类的方法:

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 个答案:

答案 0 :(得分:2)

如果您查看错误,则表示您在Graphique类的第77行有一个空引用。

查看此行并调试它以查看您的空引用是什么!

我认为这是方法初始化中的系列变量,为null;)

结论:当您实例化Graphisme对象时,l2为null。

答案 1 :(得分:0)

此代码段不执行任何操作,因为它只创建一个列表,并且不对列表执行任何操作。

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时,上面的三个变量都是null。