Creation d'interface graphique en java [Résolu]

Signaler
Messages postés
18
Date d'inscription
jeudi 20 juillet 2006
Statut
Membre
Dernière intervention
3 septembre 2006
-
Messages postés
18
Date d'inscription
jeudi 20 juillet 2006
Statut
Membre
Dernière intervention
3 septembre 2006
-
Bonjour.

Je développe en ce moment une interface graphique en java ( merci le tuto de tucobouch ), mais j'ai un petit probleme.

Si je met tout dans la classe Fenetre, et que mon main se contente de creer une Fenetre, tout va bien, affichage de la fenetre a l'écran, avec mes bontons, mes scrolls, etc...

Si je tente de mettre les differents Panel dans des classes differentes (car j'ai des Panels qui se répètent), et pour faciliter la relecture, ma classe fenetre veux bien ajouter toutes mes classes dans la fenetre, mais ceux-ci ne s'affiche pas à l'écran.
Avant tous les fichiers étaient dans le même package, mais ca ne marchait quand même pas.

Quelle est mon erreur ?
Je programme sous windows, avec eclipse 3.2, sans le VE (J'arrive pas a m'en servir :p )

classe TafelVisual, avec le main
////////////////////////////////////////////////////////////////////////////////
package main_window;
import javax.swing.JFrame;

import tafelComponents.*;

public class TafelVisual extends JFrame{

   
    private static final long serialVersionUID = 1L;

    public static void main(String[] args)
        {
            Fenetre fen = new Fenetre();
            StoffMenu menu1 = new StoffMenu();
            VariablenMenu menu2 = new VariablenMenu("Erste bekannte Variable");
            VariablenMenu menu3 = new VariablenMenu("Zweite bekannte Variable");
            EinorParButton menu4 = new EinorParButton();
           
           
           
            fen.setContentPane(menu1);
            fen.add(menu2);
            fen.add(menu3);
            fen.add(menu4);
            fen.setVisible(true);
        }

}

classe Fenetre
/////////////////////////////////////////////////////////////////////////////////////////////
package tafelComponents;

import javax.swing.*;

public class Fenetre extends JFrame {
    public StoffMenu menu1 = new StoffMenu();
   
    private static final long serialVersionUID = 1L;

    public Fenetre()
    {
        super("Interface für fluidp");
        this.setSize(300, 200);
       
        JPanel mainPanel=new JPanel();
        BoxLayout bl1 = new BoxLayout(mainPanel,BoxLayout.Y_AXIS);
        mainPanel.setLayout(bl1);
        this.add(menu1);
    }
  
   
}

classe VariablenMenu, un des Panels que je cherche à ajouter
///////////////////////////////////////////////////////////////
package tafelComponents;

import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class VariablenMenu extends JPanel{
    // This Panel allows you to say what fields you already know
    private static final long serialVersionUID = 1L;

    public VariablenMenu(String s){
        JPanel pan = new JPanel();
        BoxLayout bl = new BoxLayout(pan,BoxLayout.X_AXIS);
        pan.setLayout(bl);
       
        JLabel lab3 = new JLabel(s);
        pan.add(lab3);
        String c[] ={"Druck(in bar)","Temperatur(in K)","RHO( in ??)"};
        JComboBox cb = new JComboBox(c);
        pan.add(cb);
        pan.setVisible(true);
       
        JTextField tf = new JTextField();
        pan.add(tf);
       
    }

}

10 réponses

Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
public class EinorParButton extends JPanel{

   

    private static final long serialVersionUID = 1L;

    JPanel pan = new JPanel();

    BoxLayout bl = new BoxLayout(pan,BoxLayout.X_AXIS);

    ButtonGroup group = new ButtonGroup();   

    JRadioButton b1 = new JRadioButton("Einzelwert",true);

    JRadioButton b2 = new JRadioButton("Parameterfeld",false);

  

    public EinorParButton(){

        pan.setLayout(bl);

        group.add(b1);

        pan.add(b1);

        group.add(b2);

        pan.add(b2);

        this.add(pan);

    }

}


"EinorParButton ne s'affiche pas, VariablenMenu plante le tout"

comment ca il plante le tout???


pour en ajouter plein tu fais


public class Fenetre extends JFrame{

    private static final long    serialVersionUID    = 7979400413333400347L;

    EinorParButton epb1 = new EinorParButton();

    EinorParButton epb2 = new EinorParButton();

    EinorParButton epb3 = new EinorParButton();

    EinorParButton epb4 = new EinorParButton();

    EinorParButton epb5 = new EinorParButton();

    JPanel pan = new JPanel();

   

    public Fenetre() {

        super("Interface für fluidp");

        this.setSize(400, 200);

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

       

        BoxLayout bl2 = new BoxLayout(pan,BoxLayout.Y_AXIS);

        pan.setLayout(bl2);

       

        pan.add(new StoffMenu());

        pan.add(epb1);
        pan.add(epb2);
        pan.add(epb3);
        pan.add(epb4);
        pan.add(epb5);


        BorderLayout bl = new BorderLayout();

       

        getContentPane().setLayout(bl);

        getContentPane().add(pan);      

    }

}


tsé le mieux avant d'essayer de faire une interface graphique avec tout
plein de composants dans tout les sens c'est de déja bien maitriser
ceux-ci et egalements de bien maistriser les notions de conteneur...
mais bon

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
Salut,


c'est pas la réponse mais public class TafelVisual extends JFrame{
c'est pas utile fais simplement public class TafelVisual{ vu que dans
le main tu utilise une autre fenetre.


je ne pourrait te dire si il y a une erreur dans StoffMenu vu que l'on a pas le code.

pour VariablenMenu tu as oublié de rattacher ton panel à l'autre soit


    public VariablenMenu(String s){

        JPanel pan = new JPanel();

        BoxLayout bl = new BoxLayout(pan,BoxLayout.X_AXIS);

        pan.setLayout(bl);

       

        JLabel lab3 = new JLabel(s);

        pan.add(lab3);

        String c[] ={"Druck(in bar)","Temperatur(in K)","RHO( in ??)"};

        JComboBox cb = new JComboBox(c);

        pan.add(cb);

        pan.setVisible(true);

       

        JTextField tf = new JTextField();

        pan.add(tf);

        this.add(pan);

       

    }


perso je te conseil plutot de faire


    public VariablenMenu(String s){

        BoxLayout bl = new BoxLayout(pan,BoxLayout.X_AXIS);

        this.setLayout(bl);

       

        JLabel lab3 = new JLabel(s);

        this.add(lab3);

        String c[] ={"Druck(in bar)","Temperatur(in K)","RHO( in ??)"};

        JComboBox cb = new JComboBox(c);

        this.add(cb);      

        JTextField tf = new JTextField();

        this.add(tf);

    }

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
Perso je te conseil de sortir tes variables des constructeurs sourtout
si dans le future tu as l'intention de les modifiers par le bia d'une
autre classe

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
18
Date d'inscription
jeudi 20 juillet 2006
Statut
Membre
Dernière intervention
3 septembre 2006

Ca ne resoud pas le probleme, mais ca me permet d'écrire un code plus lisible, et vu que je devrais les modifier apres, merci pour l'info.

Apres remaniement, voila mon code ( a nouveau )
Les trois classes sont dans trois fichiers différents, et dans le même paquetage.

petite différence depuis ce matin :
apres de nombreuses manip, maintenant j'obtiens une fenetre vide, sans titre :'(

class TafelVisual
/////////////////////////////////////////////////////////////////////////////////////

package main_window;
import javax.swing.JFrame;

public class TafelVisual extends JFrame{

    private static final long serialVersionUID = 1L;

    public static void main(String[] args)
        {
            Fenetre fen = new Fenetre();
            fen.setVisible(true);
        }
}

class Fenetre
//////////////////////////////////////////////////////////////////////////////////////
package main_window;

import javax.swing.*;

public class Fenetre extends JFrame{
   
    private static final long serialVersionUID = 1L;
   
    public Fenetre()
    {
        super("Interface für fluidp");
        this.setSize(400, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
   
}

class StoffMenu
//////////////////////////////////////////////////////////////////////////////////////
package main_window;

import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JLabel;

public class StoffMenu extends JPanel{
   
    private static final long serialVersionUID = 1L;
   
    JPanel pan = new JPanel();
    BoxLayout bl = new BoxLayout(pan,BoxLayout.X_AXIS);
    JLabel lab = new JLabel("Gas studiert :");
    String c[] = {"H2","O2","N2","H2O","CH4"};
    JComboBox cb = new JComboBox(c);

    public StoffMenu(){
   
        pan.setLayout(bl);       
        pan.add(lab);
        pan.add(cb);
       
        this.setVisible(true);
        this.add(pan);
            
    }
   
}
Messages postés
18
Date d'inscription
jeudi 20 juillet 2006
Statut
Membre
Dernière intervention
3 septembre 2006

oups, j'avais oublie d'ajouter le StoffMenu, mais ca n'a rien change ( je le rajoute dans le constructeur de Fenetre)
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
Oki donc voici le code j'ai mis 2-3 commentaires


package main_window;


public class TafelVisual {

    public static void main(String[] args)

    {

        //pas utile pour juste afficher la fenetre

        //Fenetre fen = new Fenetre();

        //fen.setVisible(true);

        new Fenetre().setVisible(true);

    }

}


------------------------------------------------------------


package main_window;


import javax.swing.JFrame;


public class Fenetre extends JFrame{

    private static final long    serialVersionUID    = 7979400413333400347L;


    public Fenetre() {

        super("Interface für fluidp");

        this.setSize(400, 200);

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        //si tu n'ajoute jamais les composant a la fenetre ils ne le feront pas

        //a ta place :D

        setContentPane(new StoffMenu());//si tu ne desire qu'un composant maitre

        //sinon utilise add et met un joli layout par defaut contrairement aux jpanel

        //qui ont un layout en FlowLayout les jframe c'est BorderLoyout

        //add(new StoffMenu(), java.awt.BorderLayout.CENTER);

    }

}


------------------------------------------------------------


package main_window;


import javax.swing.BoxLayout;

import javax.swing.JComboBox;

import javax.swing.JLabel;

import javax.swing.JPanel;


public class StoffMenu extends JPanel{

  

    private static final long serialVersionUID = 1L;

  

    //JPanel pan = new JPanel();

    //BoxLayout bl = new BoxLayout(pan,BoxLayout.X_AXIS);

    BoxLayout bl = new BoxLayout(this,BoxLayout.X_AXIS);

    JLabel lab = new JLabel("Gas studiert :");

    String c[] = {"H2","O2","N2","H2O","CH4"};

    JComboBox cb = new JComboBox(c);


    public StoffMenu(){

        //pas utile oublie pas que tu es deja dans un JPanel

        //pan.setLayout(bl);      

       // pan.add(lab);

        //pan.add(cb);

        //this.add(pan);

        //this.setVisible(true);//pas utile

        setLayout(bl);      

        add(lab);

        add(cb);

    }

  

}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
18
Date d'inscription
jeudi 20 juillet 2006
Statut
Membre
Dernière intervention
3 septembre 2006

Bon, ca résoud la plupart de mes problèmes, sauf un.

je cherche a mettre des menu, (comme StoffMenu) les uns en dessous des autres, (c'est pas plus facile avec un JPanel ? )
et je n'arrive pas à mettre le layout avec BorderLayout.

        BorderLayout bl = new BorderLayout(); // ca fonctionne

        this.setLayout(bl); // la ca plante
ou
       add(new StoffMenu(), java.awt.BorderLayout.CENTER);
// qui plante aussi

(Désolé si ca te semble être me macher le boulot, je galère dessus depuis ce matin)
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
tu tourne avec quel jdk 1.4 ou 1.5


si tu es avec le jdk 1.5 cela devrai fonctionner sinon il te faut passer par le contentpane


getContentPane().setLayout(bl);

getContentPane().add(new StoffMenu(), java.awt.BorderLayout.CENTER);


"je cherche a mettre des menu"

des menu comme Fichier, Edition, etc... ? si oui passe par un JMenu et pour le ratacher a une JFrame tu fais setJMenu(monJmenu);


"Désolé si ca te semble être me macher le boulot, je galère dessus depuis ce matin"

c'est rien va :D

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
18
Date d'inscription
jeudi 20 juillet 2006
Statut
Membre
Dernière intervention
3 septembre 2006

Bon, ca fonctionne tant que j'ajoute StoffMenu, (je passe par un JPanel pour mettre plusieurs StoffMenu),
mais quand je tente d'ajouter un EinorParButton, ou un VariablenMenu au JPanel, c'est plus ca (EinorParButton ne s'affiche pas, VariablenMenu plante le tout).
Donc, comment puis-je rajouter un grand nombre de ces Menus sans que ca plante ? ( il m'en faut 5 ou 6, dont 4 differents)

class Fenetre
//////////////////////////////////////////////////////////
public class Fenetre extends JFrame{
    private static final long    serialVersionUID    = 7979400413333400347L;
    JPanel pan = new JPanel();
   
    public Fenetre() {
        super("Interface für fluidp");
        this.setSize(400, 200);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
       
        BoxLayout bl2 = new BoxLayout(pan,BoxLayout.Y_AXIS);
        pan.setLayout(bl2);
       
        pan.add(new StoffMenu());
       
        BorderLayout bl = new BorderLayout();
       
        getContentPane().setLayout(bl);
        getContentPane().add(pan);      
    }
}

class EinorParButton
//////////////////////////////////////////////////
public class EinorParButton extends JPanel{
   
    private static final long serialVersionUID = 1L;
    JPanel pan = new JPanel();
    BoxLayout bl = new BoxLayout(pan,BoxLayout.X_AXIS);
    ButtonGroup group = new ButtonGroup();   
    JRadioButton b1 = new JRadioButton("Einzelwert",true);
    JRadioButton b2 = new JRadioButton("Parameterfeld",false);
  
    public EinorParButton(){
        pan.setLayout(bl);
        group.add(b1);
        pan.add(b1);
        group.add(b2);
        pan.add(b2);
    }
}

class VariablenMenu
////////////////////////////////////////////////////////////7
public class VariablenMenu extends JPanel{
    private static final long serialVersionUID = 1L;
    JPanel pan = new JPanel();
    public VariablenMenu(String s){
        BoxLayout bl = new BoxLayout(pan,BoxLayout.X_AXIS);
        this.setLayout(bl);
      
        JLabel lab3 = new JLabel(s);
        this.add(lab3);
        String c[] ={"Druck(in bar)","Temperatur(in K)","RHO( in ??)"};
        JComboBox cb = new JComboBox(c);
        this.add(cb);     
        JTextField tf = new JTextField();
        this.add(tf);
    }
}
Messages postés
18
Date d'inscription
jeudi 20 juillet 2006
Statut
Membre
Dernière intervention
3 septembre 2006

Ca y est, j'ai trouve l'erreur cachée

JPanel pan = new JPanel();
    public VariablenMenu(String s){
        BoxLayout bl = new BoxLayout(pan,BoxLayout.X_AXIS);
        this.setLayout(bl);

je cree un JPanel, sauf que j'utilisais le BoxLayout pour un autre (this et pan sont deux JPanel differents)

je peux enfin continuer.

Merci pour l'aide !