Un problème dans l'interface

Résolu/Fermé
mounir89 Messages postés 21 Date d'inscription jeudi 4 octobre 2012 Statut Membre Dernière intervention 1 janvier 2013 - 17 nov. 2012 à 15:13
tjanh123 Messages postés 8 Date d'inscription mardi 20 novembre 2012 Statut Membre Dernière intervention 15 mai 2013 - 21 nov. 2012 à 14:34
Bonjour,

Voici le programme que j'ai fait en Java sous Eclipse:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.text.NumberFormat;
import java.util.Random;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;




public class d extends JFrame {

private JFormattedTextField jtf = new JFormattedTextField(NumberFormat.getIntegerInstance());

private JLabel label = new JLabel("Entrer N");

private JFormattedTextField jtf1 = new JFormattedTextField(NumberFormat.getIntegerInstance());
private JLabel label1 = new JLabel("Entrer P");;


private JButton b = new JButton ("Démarrer");

public d(){
super();
setSize( 500, 500 );
setTitle( "Dessin d'un graph" );
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout( new BorderLayout() );
JScrollPane sclp = new JScrollPane();
sclp.setPreferredSize( new Dimension( 100, 500 ) );
JTable table = new JTable();


//sclp.setPreferredSize( new Dimension( 100, 500 ) );

DefaultTableModel tmn = new DefaultTableModel();
table.setModel( tmn );
tmn.addColumn( "Noeud" ); tmn.addColumn( "Degré" );






int n = Integer.parseInt(jtf.getValue().toString()); // ici l'erreur





int[][] M= new int[n][n];
int[] tab= new int[n];
int[][] T = new int [n][2];

float x;


float p =Float.parseFloat(jtf1.getValue().toString()); // ici l'erreur

Random r = new Random();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
x = (int) r.nextInt(9);

if(x>=p)
M[i][j] = 1;

else M[i][j] = 0;

}
}

//affichage de la matrice
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){

System.out.print(M[i][j]+" " );
}
System.out.println();
}
//la somme de chaque ligne
for(int ii=0;ii<n;ii++){
int s=0;
for(int jj=0;jj<n;jj++){
s=s+M[ii][jj];

}
tab[ii]=s;
}

System.out.println(" ::::::Affichage les noeuds :::::::");
for(int i=0; i<n; i++){


System.out.print("\n"+tab[i]+" " );
}

int count =0,e=0;
boolean bool;
for( int i=0;i<n;i++){
int h=0;
bool=true;
while(h<n){

if( (tab[i]==tab[h])&&(i>h)){
h=n;
bool=false;

}

else if ( tab[i]==tab[h]){
count++;
}
h++;
}
if(bool==true){
T[i][0]=tab[i];
T[i][1]=count ;


count=0;
}

// ***************************************************************************************************** //

}
System.out.print("\n Affichage de chaque noeud et son degré " );
for( int i=0;i<n;i++){
if(T[i][1]!=0){
System.out.print("\n"+T[i][0] +"|" +T[i][1]+" " );
}

}

// le trie
int xx,yy;

for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(T[i][0]<T[j][0] )
{
xx=T[i][0];
T[i][0]=T[j][0];
T[j][0]=xx;

yy=T[i][1];
T[i][1]=T[j][1];
T[j][1]=yy;

}
}
}
System.out.print("\n Affichage de T trié " );
for( int i=0;i<n;i++){
if(T[i][1]!=0){
System.out.print("\n"+T[i][0] +"|" +T[i][1]+" " );
}

}
for(int i=0;i<n;i++){
if(T[i][1]!=0){
Object[] vals = { T[ i ][0] , T[ i ][ 1 ] };
tmn.addRow( vals );
}
}
int X=0, Y = 0;
// create a dataset...
XYSeries series = new XYSeries("TP DE DEGRE");
for(int i=0;i<n;i++){
if(T[i][0]!=0) {
X=T[i][0];
Y=T[i][1];
series.add(X, Y);
}
}


XYDataset xyDataset = new XYSeriesCollection(series);

// create a line chart...
JFreeChart chart = ChartFactory.createXYAreaChart(
"", // Title
"Noeud", // X-Axis label
"Degré", // Y-Axis label
xyDataset, // Dataset
PlotOrientation.VERTICAL,
true,
true,
false);
ChartFrame frame1=new ChartFrame("Affichage du graphe",chart);
frame1.setVisible(true);
frame1.setSize(300,300);

sclp.getViewport().add( table );
JPanel pnl = new JPanel();
getContentPane().add(pnl, BorderLayout.NORTH);
pnl.setBackground(Color.white);
pnl.setLayout(new BorderLayout());

JPanel pnl1 = new JPanel();
pnl1.setLayout(new BorderLayout());
pnl1.add(label, BorderLayout.WEST);
pnl1.add(jtf, BorderLayout.EAST);
jtf.setPreferredSize(new Dimension(150, 30));
jtf.setForeground(Color.BLUE);
Font police = new Font("Arial", Font.BOLD, 14);
jtf.setFont(police);
pnl.add(pnl1, BorderLayout.WEST);
pnl1.setBackground(Color.white);


JPanel pnl2 = new JPanel();
pnl2.setLayout(new BorderLayout());
pnl2.add(label1, BorderLayout.WEST);
pnl2.add(jtf1, BorderLayout.EAST);
jtf1.setPreferredSize(new Dimension(150, 30));
jtf1.setForeground(Color.BLUE);
pnl2.setBackground(Color.white);

jtf1.setFont(police);
pnl.add(pnl2, BorderLayout.EAST);


JPanel pnl21 = new JPanel();
getContentPane().add(pnl21, BorderLayout.CENTER);
pnl21.setBackground(Color.LIGHT_GRAY);
pnl21.add( sclp );





}



public static void main(String[] args) {
// TODO Auto-generated method stub
new d().setVisible( true );;
}

}

J'ai fait une interface sur laquelle j'ai mis deux champs textfield ( entre n et l'autre entre p) , et et après je veux récupérer la valeur de n et p pour les utiliser dans la suite de programme .
Voici l'erreur : Exception in thread "main" java.lang.NullPointerException.

Je suis dans l'attente d'une réponse . et Merci d'avance .

7 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
17 nov. 2012 à 15:46
jtf.getValue() vaut null, ce qui est normal vu que tu lis cette valeur avant même que la fenêtre ne s'affiche, donc personne n'a pu remplir le champ.
0
mounir89 Messages postés 21 Date d'inscription jeudi 4 octobre 2012 Statut Membre Dernière intervention 1 janvier 2013
17 nov. 2012 à 16:40
Merci pour la réponse ,

j'ai fait setvisible(true) apres tmn.addColumn( "Noeud" ); tmn.addColumn( "Degré" );
mais le problème reste . je suis perdu , est-ce que tu peux m'aider svp .

merci d'avance.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
17 nov. 2012 à 16:49
Oui, mais si tu fais la même chose juste après ça ne change rien car l'utilisateur n'a toujours pas le temps de modifier les valeurs avant que tu ne les lises.

En général les étapes sont les suivantes :
- On affiche la fenêtre avec les champs vides
- On ne fait rien pour que l'utilisateur puisse remplir les champs
- À l'aide d'un bouton (ou d'un autre mécanisme) l'utilisateur valide sa saisie
- Et ce n'est qu'à ce moment là qu'on lit les champs
0
mounir89 Messages postés 21 Date d'inscription jeudi 4 octobre 2012 Statut Membre Dernière intervention 1 janvier 2013
17 nov. 2012 à 17:11
Merci infiniment , j'ai régler le problème
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
17 nov. 2012 à 17:12
Une façon simple (mais pas forcément idéale) de modifier ton code c'est de faire comme ceci :

Rajouter les valeurs "n" et "p" au constructeur de "d"
Et de remplacer les deux lignes qui te posaient problème par une édition des champs.

public d(int n, float p)
{
    // ...
    
    //int n = Integer.parseInt(jtf.getValue().toString());
    jtf.setValue(n);
    
    //float p = Float.parseFloat(jtf1.getValue().toString());
    jtf1.setValue(p);
    
    // ...
}

Ensuite comme il faut passer ces deux paramètres au constructeur je te propose de modifier un peu le main :

private static String get(String message)
{
	return (String) JOptionPane.showInputDialog(null, message, "", JOptionPane.PLAIN_MESSAGE, null, null, "");
}

public static void main(String[] args) 
{
	int n = Integer.parseInt(get("Entrez n"));
	float f = Float.parseFloat(get("Entrez p"));
	new d(n,f).setVisible( true );;
}
0
mounir89 Messages postés 21 Date d'inscription jeudi 4 octobre 2012 Statut Membre Dernière intervention 1 janvier 2013
17 nov. 2012 à 17:19
Merci mon ami , je te souhaite bonne fin journée .
0
tjanh123 Messages postés 8 Date d'inscription mardi 20 novembre 2012 Statut Membre Dernière intervention 15 mai 2013
21 nov. 2012 à 14:34
bonjour,
Si vous voulez récupérer une valeur de JTextField,
J'ai une méthode :



float p =Float.parseFloat(jtf1.getValue().toString()); // ici l'erreur
---> float p = Float.parseFloat(jtf1.getText());
-1