JLabel Java swing

Résolu
aveuglemspas_sourd Messages postés 312 Statut Membre -  
aveuglemspas_sourd Messages postés 312 Statut Membre -
Bonjour,

Je cré une boucle :

while( rs2.next() )
{

System.out.println(rs2.getString( "question" ));
etiket = new JLabel(rs2.getString( "question" ));
co.add(etiket);
}
cela affiche exactement ce que je veux , mais le JLabel ne fonctionne pas, cela me sort une erreur : java.sql.SQLException: No data found .. donc je comprend pas pourquoi l'affichage console fonctionne mais que le Jlabel ne fonctionne pas.
merci d'avance
Configuration: Windows Vista Internet Explorer 7.0

16 réponses

  1. sandul Messages postés 4013 Statut Membre 723
     
    Okay, si Excel. Têtre bien un bug (pas autorisé d'accéder aux mêmes données deux fois de suite. Comme disait Héraclite, hein...)

    avec ta variante ,j'ai pas d'erreur mais les jlabel ne s'affiche pas <== mais tu as à la console l'ensemble de tes valeurs ? Pis, tu as vraiment vérifié que le remplacement de la boucle while par une et unique construction de JLabel permet de régler le souci ?
    1
  2. sandul Messages postés 4013 Statut Membre 723
     
    Ton code peut être amélioré... Je ne discute que les premières lignes, sinon ça prendrait trop de temps.

    - Indentation, ligne blanches, espaces entourant les arguments ==> code difficile à lire. Utilise un truc de formatage (si tu es sous Eclipse, fais un CTRL+SHIFT+F)
    - public class test ==> le nom doit commencer par une majuscule (convention Java)
    -
    JFrame f = new Fenetre();
    f.setVisible(true);
    ==> oui, ça marche... Mais Sun recommande de faire ceci pour lancer une classe Swing:
    EventQueue.invokeLater(new Runnable() {
    	public void run() {
    		try {
    			Fenetre frame = new Fenetre();
    			frame.setVisible(true);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    });

    -
    private JButton bouton2;
    private Map<String, JCheckBox>boxes = new HashMap<String, JCheckBox>();
    private Iterator it;
    private static String tabl[] = new String[1000];
    ==> manque de commentaires, nom des variables peu significatif, déclarations qui auraient pu être faites au moment de l'utilisation des variables...

    Et ainsi de suite... Encore un tit bout de chemin avant que ce code ressemble à un code de pro. Mais ne désespère pas pour autant. Lis des bouquins de programmation, c'est important...

    Concernant le MVC: l'appliquer pour cette simple application (Swing + accès direct à la base) = utiliser un fusil pour tuer une mouche. On applique le MVC dans des modèles plus complexes, genre applications 3 tiers...

    ++
    1
  3. sandul Messages postés 4013 Statut Membre 723
     
    Salut,

    donc je comprend pas pourquoi l'affichage console fonctionne mais que le Jlabel ne fonctionne pas <==

    Ca ne fonctionne pas tant que ça, d'après ta description. Car tu n'as pas à la console le contenu de la colonne 'question' mais bien une simple erreur d'accès à la base ^^

    ++
    0
  4. aveuglemspas_sourd Messages postés 312 Statut Membre 20
     
    heu si j'ai le contenu de la base puisque le system.out.println affiche bien ce que je veux

    En fait j'ai exactement ce que je veux quand je ne met pas le JLabel c'est à dire :

    while( rs2.next() )
    {

    System.out.println(rs2.getString( "question" ));

    }

    lorsque j'ai ce code, l'interrogation de la base de donnée fonctionne niquel
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sandul Messages postés 4013 Statut Membre 723
     
    Alors c'est dû au fait que ta boucle est interrompue de manière brutale (par l'erreur DB) et que ton "co" n'a pas fini de s'initialiser... Sans voir plus de code, il est impossible de dire ce qui se passe réellement.
    0
  7. aveuglemspas_sourd Messages postés 312 Statut Membre 20
     
    alors je te décri un peu le code :

    j'ai une classe de test
    et 2 fenetre.
    L'erreur se déroule dans la deuxième fenetre.
    La premiere fenetre interroge la bdd, et récupere des thème et les affiche.
    La deuxieme fenetre recupere les thème coché et recupere les questions correspondante :

    test :

    import java.sql.SQLException;
    import javax.swing.*;

    public class test

    {
    public static void main( String [] args ) throws SQLException
    {

    JFrame f = new Fenetre();
    f.setVisible(true);

    }
    }


    fenetre 1

    import javax.swing.*;

    import java.awt.*;
    import java.awt.event.*;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;

    class Fenetre extends JFrame implements ActionListener
    {
    private JButton bouton2;
    private Map<String, JCheckBox>boxes = new HashMap<String, JCheckBox>();
    private Iterator it;
    private static String tabl[] = new String[1000];

    public Fenetre()
    {
    setTitle("Questionnaire audit");
    Container co = getContentPane();
    co.setLayout(new FlowLayout());
    setSize(500, 300);
    setLocationRelativeTo(this.getParent());
    setDefaultCloseOperation(3);
    Connection c = null;
    Statement stmnt = null;
    //on essai d'etablir la connection
    try
    {
    //on renseigne le driver
    Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
    // on donne les parametre de la connection : quest étant ce que l'on a defini dans le panneau de controle
    c = DriverManager.getConnection( "jdbc:odbc:quest", "", "" );
    stmnt = c.createStatement();
    //notre requete sql
    String query = "select chapitre from [quess$] order by ide asc;";
    //on met le resultat de notre requete dans un resultset
    ResultSet rs = stmnt.executeQuery( query );
    //on boucle sur notre resultset
    while( rs.next() )
    {

    boxes.put(rs.getString( "chapitre" ),new JCheckBox());

    }

    }
    catch( Exception e )
    {
    System.err.println( e );
    }
    finally
    {
    try
    {
    stmnt.close();
    c.close();
    }
    catch( Exception e )
    {
    System.err.println( e );
    }
    }

    JCheckBox box;
    for(String name : boxes.keySet())
    {
    box = boxes.get(name);
    box.setLabel(name);
    }

    it = boxes.keySet().iterator();
    while (it.hasNext())
    {
    co.add(boxes.get(it.next()));
    }

    bouton2 = new JButton("Valider");
    co.add(bouton2);
    bouton2.addActionListener(this);

    }

    public void actionPerformed(ActionEvent a)
    {
    String tab[] = new String[boxes.size()];

    int i= 0;
    JCheckBox box;
    for(String name : boxes.keySet())
    {
    box = boxes.get(name);
    if(box.isSelected())
    {
    tab[i] = (String)box.getLabel();
    getTabl()[i]= (String)box.getLabel();
    i++;
    }

    }

    dispose();
    JFrame f2 = new Fenetre2();

    f2.setVisible(true);

    }

    public static void setTabl(String tabl[]) {
    Fenetre.tabl = tabl;
    }

    static String[] getTabl() {
    return tabl;
    }

    }



    fenetre 2 :(là ou il y a l'erreur)

    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;

    import javax.swing.JFrame;
    import javax.swing.JLabel;

    class Fenetre2 extends JFrame implements ActionListener

    {
    static String Chap[];
    private JLabel etiket;
    private String help;
    public Fenetre2()

    {
    int k=0;

    setTitle("Questionnaire audit");
    Container co = getContentPane();
    co.setLayout(new FlowLayout());
    setSize(500, 300);
    setLocationRelativeTo(this.getParent());
    setDefaultCloseOperation(3);
    Fenetre f = new Fenetre();
    String query ="select question from [ques$],[quess$] where ide=chap AND chapitre IN (";

    while(Fenetre.getTabl()[k] != null)
    {
    k++;
    }

    for(int i=0;i<k;i++)
    {

    if(i< k- 1)
    {
    Fenetre.getTabl()[i]="'"+Fenetre.getTabl()[i]+"'";
    query += Fenetre.getTabl()[i]+"," ;
    }
    else
    {
    Fenetre.getTabl()[i]="'"+Fenetre.getTabl()[i]+"'";
    query += Fenetre.getTabl()[k-1]+")order by id";
    }
    }

    Connection c2 = null;
    Statement stmnt2 = null;
    try
    {
    Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
    c2 = DriverManager.getConnection( "jdbc:odbc:quest", "", "" );
    stmnt2 = c2.createStatement();
    ResultSet rs2 = stmnt2.executeQuery( query );
    while( rs2.next() )
    {

    System.out.println(rs2.getString( "question" ));
    etiket = new JLabel(rs2.getString( "question" ));
    co.add(etiket);
    }

    }
    catch( Exception e )
    {
    System.err.println( e );
    }
    finally
    {
    try
    {
    stmnt2.close();
    c2.close();
    }
    catch( Exception e )
    {
    System.err.println( e );
    }
    }

    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub

    }
    }
    0
  8. sandul Messages postés 4013 Statut Membre 723
     
    Chais pô...

    Change tes
    System.err.println( e ); 
    par des
    e.printStackTrace();
    pour voir plus clair... Utilise un breakpoint sur ta boucle while pour voir de plus près... Remplace ces lignes
    System.out.println(rs2.getString( "question" ));
    etiket = new JLabel(rs2.getString( "question" )); 
    par
    etiket = new JLabel("test"); 
    pour voir si sans accès à la base tu as tes JLabel affichées...

    Plein de solutions, tu vois.

    ++
    0
  9. aveuglemspas_sourd Messages postés 312 Statut Membre 20
     
    je peux te dejà te dire que sans l'accès à la bdd, les jLabel fonctionnent
    0
  10. sandul Messages postés 4013 Statut Membre 723
     
    Merci pour cette info, je t'en saurai éternellement gré.

    Si tu postais le stack trace? ^^
    0
  11. aveuglemspas_sourd Messages postés 312 Statut Membre 20
     
    pas de soucis^^
    suffit de demander

    voici le stackrace, avec la première question qui fonctionne donc c'est bien le Jlabel qui fait bugué lol

    la charge de travail?
    java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
    at Fenetre2.<init>(fenetre2.java:66)
    at Fenetre.actionPerformed(fenetre.java:111)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.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.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(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)
    0
  12. sandul Messages postés 4013 Statut Membre 723
     
    Arf, zarbi. Tu es en cours de dénicher le bug du siècle ;-)

    Question: pourquoi utilises-tu le driver odbc-jdbc? Beaucoup moins stable et performant par rapport à un driver jdbc. Sun recommande de ne PAS utiliser ce driver en prod...

    Essayons maintenant ceci comme variante:
    String colVal = rs2.getString( "question" );
    System.out.println(colVal);
    etiket = new JLabel(colVal); 


    Ca donne quoi?
    0
  13. aveuglemspas_sourd Messages postés 312 Statut Membre 20
     
    heu ma base de donnée c'est des feuille excel, donc j'utilise odbc, après peut être que je peux utiliser juste jdc mais j'ai pas trouver.

    avec ta variante ,j'ai pas d'erreur mais les jlabel ne s'affiche pas
    0
  14. aveuglemspas_sourd Messages postés 312 Statut Membre 20
     
    oui j'ai les valeurs de la bdd et oui oui j'avais deja tester, si je met uniquement des Jlabel, ces dernier s'affichent bien dans ma fenetre.
    0
  15. sandul Messages postés 4013 Statut Membre 723
     
    Chuis en panne d'idées... Fais une exécution pas à pas pour voir ce qui se passe...
    0
  16. aveuglemspas_sourd Messages postés 312 Statut Membre 20
     
    Hm lol quand je fais ça, ça marche .. si avec le system.out ça marche pas , donc je pense que t'avai raison quand tu disai qu'on peu pas acceder 2 fois aux données.

    while( rs2.next() )
    {

    etiket = new JLabel(rs2.getString( "question" ));
    co.add(etiket);
    }

    En tout cas merci de m'avoir aider :)

    Et j'aurais une dernière question : Que pense tu de mon code? devrai je le recommencer en appliquant le MVC ( en sachant que je n'ai jamais fait de MVC )
    merci encore
    0
  17. aveuglemspas_sourd Messages postés 312 Statut Membre 20
     
    Daccord, merci à toi :)
    0