我的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)
我不知道问题出在哪里,谢谢你的帮助
答案 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。