OVH Cloud OVH Cloud

Mise à jour d'une JList initiée via une base de donnée ?

3 réponses
Avatar
David Tran Quang Ty
Bonjour à tous,

Toujours dans le cadre de mon developpement d'applet avec une JList,
j'aimerai savoir si il est possible de la mettre à jour en temps plus ou
moins réel... Avec la JList que j'ai actuellement, qui est crée, puis
initiée d'après les données d'une base de données MySQL, j'avais pensé
qu'en rappelant simplement la fonction qui l'avait créée me permettrait
de créer une nouvelle JList avec les élèments fraîchement changé...
Seulement, cela n'a pas l'air de fonctionner comme je le souhaiterais -_-

Ce qui se passe actuellement, c'est que lorsque je rappelle la fonction,
via un bouton rafraichir subtilement placé, qui a permis de créer cette
JList, les informations fournie par la console m'indique que le vecteur
a bien récupéré les données mises à jour de la base de données, mais il
semblerait que la liste ne veuille pas se réinitialiser... Même avec un
repaint, cela ne me donne pas ce que je voudrais.

L'erreur donnée par la console est la suivante :

Exception in thread "AWT-EventQueue-3" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
at java.util.StringTokenizer.<init>(Unknown Source)
at ListeTable$1.valueChanged(ListeTable.java:358)
at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
at javax.swing.DefaultListSelectionModel.setSelectionInterval(Unknown
Source)
at javax.swing.JList.setSelectionInterval(Unknown Source)
at
javax.swing.plaf.basic.BasicListUI$Handler.adjustFocusAndSelection(Unknown
Source)
at javax.swing.plaf.basic.BasicListUI$Handler.mousePressed(Unknown Source)
at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-3" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
at java.util.StringTokenizer.<init>(Unknown Source)
at ListeTable$1.valueChanged(ListeTable.java:358)
at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.setValueIsAdjusting(Unknown
Source)
at javax.swing.JList.setValueIsAdjusting(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Le code la fonction dissidente :

public void makeTableJeu() throws Exception
{
int i =0;

realData = new Vector();
list = null;

try
{
conn1 = new connex();
}
catch(Exception e)
{ System.err.println("\n*** Exception caught in Load()");
throw e;
}

conn1.loadDriverAndConnect();

Statement instruction = null;
ResultSet resultat = null;

instruction = conn1.conn.createStatement();
resultat = instruction.executeQuery("SELECT COUNT(nom_partie) FROM
partie");

while(resultat.next())
{
nbElement = resultat.getInt(1);
}

System.out.println(nbElement);

instruction = conn1.conn.createStatement();
resultat = instruction.executeQuery("SELECT * FROM partie");

while(resultat.next())
{

String data = new String (resultat.getInt(1)+"-"
+resultat.getString(2)+" - "
+resultat.getString(3)+" - "
+resultat.getString(4)+" - "
+resultat.getString(5)+" - "
+resultat.getString(6));
realData.add(data);
i++;
}

conn1.close();


System.out.println(realData);

list = new JList(realData);
list.setFont(f);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setVisibleRowCount(-1);
list.setSeletedIndex(0);

list.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged( ListSelectionEvent ee)
{
String str1 = (String)list.getSelectedValue();
StringTokenizer st = new StringTokenizer(str1);
String str = st.nextToken();

int tmp = Integer.parseInt(str);

try
{
makeZone(tmp, 2);
}
catch(Exception e)
{
System.err.println("\n*** Exception caught in makeTableJeu");
System.err.println(e);

}

tableCourante = tmp;
System.out.println(tmp);
System.out.println(list.getSelectedValue());
}
});

}

L'appel à la fonction est le suivant, dans un ActionPerfomed :

if (ae.getSource() == rafraichir)
{

try {
makeTableJeu();
list.repaint();
}
catch(Exception e)
{
System.err.println("\n*** Exception caught in makeTableJeu in init()");
}


Je me doute que mon approche est un peu cavalière, ce qui explique
sûrement le pourquoi du comment de mon erreur, mais je dois avouer ne
pas trop voir comment corriger ça...

Toute aide est donc la bienvenue ^^

Merci d'avance ^^

3 réponses

Avatar
JScoobyCed
David Tran Quang Ty wrote:

Bonjour,

Votre list n'a pas de value selectionnee quand vous rafraichissez:


L'erreur donnée par la console est la suivante :

Exception in thread "AWT-EventQueue-3" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
at java.util.StringTokenizer.<init>(Unknown Source)


Cela permet de voir que l'erreur est dans le constructeur de
StringTokenizer:

{
public void valueChanged( ListSelectionEvent ee)
{
String str1 = (String)list.getSelectedValue();
StringTokenizer st = new StringTokenizer(str1);


public StringTokenizer(String str) {
this(str, " tnrf", false);
}

qui renvoie a :

public StringTokenizer(String str, String delim, boolean returnDelims) {
currentPosition = 0;
newPosition = -1;
delimsChanged = false;
this.str = str;
maxPosition = str.length();
delimiters = delim;
retDelims = returnDelims;
setMaxDelimChar();
}

La ligne
maxPosition = str.length();
renvoie un NullPointerException si la chaine donnee au constructeur est NULL

(String)list.getSelectedValue() renvoie donc NULL

--
JSC

Avatar
Symon
Oui, il suffit de mettre à jour son modèle (voir doc DefaultListModel
par exemple).

Par contre, il faut éviter de se connecter directement à une base de
donnée via un applet, qui n'est sensé dialoguer que sur le port 80.
Mieux vaut passer par une servlet, qui alimentera par exemple ton applet
via un flux XML ou autre.

Par rapport à ton erreur de compilation, elle est très claire : tu
essayes de créer un StringTokenizer à partir d'une référence nulle
(classe ListeTable, ligne 358).

A+

Symon

David Tran Quang Ty wrote:
Bonjour à tous,

Toujours dans le cadre de mon developpement d'applet avec une JList,
j'aimerai savoir si il est possible de la mettre à jour en temps plus ou
moins réel... Avec la JList que j'ai actuellement, qui est crée, puis
initiée d'après les données d'une base de données MySQL, j'avais pensé
qu'en rappelant simplement la fonction qui l'avait créée me permettrait
de créer une nouvelle JList avec les élèments fraîchement changé...
Seulement, cela n'a pas l'air de fonctionner comme je le souhaiterais -_-

Ce qui se passe actuellement, c'est que lorsque je rappelle la fonction,
via un bouton rafraichir subtilement placé, qui a permis de créer cette
JList, les informations fournie par la console m'indique que le vecteur
a bien récupéré les données mises à jour de la base de données, mais il
semblerait que la liste ne veuille pas se réinitialiser... Même avec un
repaint, cela ne me donne pas ce que je voudrais.

L'erreur donnée par la console est la suivante :

Exception in thread "AWT-EventQueue-3" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
at java.util.StringTokenizer.<init>(Unknown Source)
at ListeTable$1.valueChanged(ListeTable.java:358)
at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown
Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown
Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown
Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown
Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown
Source)
at
javax.swing.DefaultListSelectionModel.setSelectionInterval(Unknown Source)
at javax.swing.JList.setSelectionInterval(Unknown Source)
at
javax.swing.plaf.basic.BasicListUI$Handler.adjustFocusAndSelection(Unknown
Source)
at javax.swing.plaf.basic.BasicListUI$Handler.mousePressed(Unknown
Source)
at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown
Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-3" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
at java.util.StringTokenizer.<init>(Unknown Source)
at ListeTable$1.valueChanged(ListeTable.java:358)
at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown
Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown
Source)
at javax.swing.DefaultListSelectionModel.setValueIsAdjusting(Unknown
Source)
at javax.swing.JList.setValueIsAdjusting(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.mouseReleased(Unknown
Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown
Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Le code la fonction dissidente :

public void makeTableJeu() throws Exception
{
int i =0;

realData = new Vector();
list = null;

try
{
conn1 = new connex();
}
catch(Exception e)
{ System.err.println("n*** Exception caught
in Load()");
throw e;
}

conn1.loadDriverAndConnect();

Statement instruction = null;
ResultSet resultat = null;

instruction = conn1.conn.createStatement();
resultat = instruction.executeQuery("SELECT COUNT(nom_partie) FROM
partie");

while(resultat.next())
{
nbElement = resultat.getInt(1);
}

System.out.println(nbElement);

instruction = conn1.conn.createStatement();
resultat = instruction.executeQuery("SELECT * FROM partie");

while(resultat.next())
{

String data = new String (resultat.getInt(1)+"-"
+resultat.getString(2)+" - "
+resultat.getString(3)+" - "
+resultat.getString(4)+" - "
+resultat.getString(5)+" - "
+resultat.getString(6));
realData.add(data);
i++;
}

conn1.close();


System.out.println(realData);

list = new JList(realData);
list.setFont(f);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setVisibleRowCount(-1);
list.setSeletedIndex(0);

list.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged( ListSelectionEvent ee)
{
String str1 = (String)list.getSelectedValue();
StringTokenizer st = new StringTokenizer(str1);
String str = st.nextToken();

int tmp = Integer.parseInt(str);

try
{
makeZone(tmp, 2);
}
catch(Exception e)
{
System.err.println("n*** Exception caught in makeTableJeu");
System.err.println(e);

}

tableCourante = tmp;
System.out.println(tmp);

System.out.println(list.getSelectedValue());
}
});

}

L'appel à la fonction est le suivant, dans un ActionPerfomed :

if (ae.getSource() == rafraichir)
{

try {
makeTableJeu();
list.repaint();
}
catch(Exception e)
{
System.err.println("n*** Exception caught in makeTableJeu
in init()");
}


Je me doute que mon approche est un peu cavalière, ce qui explique
sûrement le pourquoi du comment de mon erreur, mais je dois avouer ne
pas trop voir comment corriger ça...

Toute aide est donc la bienvenue ^^

Merci d'avance ^^


Avatar
David Tran Quang Ty
Merci de vos réponses, cela m'a une fois de plus sorti du pétrin ^^

Par contre, il faut éviter de se connecter directement à une base de
donnée via un applet, qui n'est sensé dialoguer que sur le port 80.
Mieux vaut passer par une servlet, qui alimentera par exemple ton applet
via un flux XML ou autre.


Et avec RMI, c'est possible aussi, dans la mesure ou je cherche juste à
récuperer des DefaultListModel ou JLabel ?

Merci encore ^^