IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Affichage combobox dans une boite de dialogue


Sujet :

AWT/Swing Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Affichage combobox dans une boite de dialogue
    Bonjour,

    J'ai un petit souci avec l'affichage d'une combobox dans une boite de dialogue. La plupart du temps je n'arrive pas a ouvrir/deployer ma combobox (work around: cliquer en dehors => perte de focus et revenir sur la boite de dialogue).
    J'ai simplifie le code au maximum.

    Ca fonctionne tres bien quand je le lance en tant qu'application sous Eclipse par exemple, mais ca bug avec IE.

    Est ce que quelqu'un a une idee.

    Merci d'avance.

    Tof

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package combo1;
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class mainApplet extends JApplet {
     
    	private static final long serialVersionUID = -1;
     
    	Frame frame = (Frame)SwingUtilities.getAncestorOfClass(Frame.class, this);
     
    	public mainApplet() {
    		super();
    	}
     
    	public void init() {
    		this.setSize(700, 400);
     
    		JPanel homePanel = new JPanel(new BorderLayout());
     
    		JPanel titlePanel = new JPanel();
    		JLabel titleLabel = new JLabel("Welcome");
    		titlePanel.add(titleLabel);
     
    		JPanel messagePanel = new JPanel();
    		JLabel messageLabel = new JLabel("Open the option menu...");
    		messagePanel.add(messageLabel);
     
    		homePanel.add(titlePanel, BorderLayout.NORTH);
    		homePanel.add(messagePanel, BorderLayout.SOUTH);
     
    		setContentPane(homePanel);
     
            createMenu();
    	}
     
    	private void createMenu() {
    		JMenuBar mBar = new JMenuBar();
            setJMenuBar(mBar);
     
            JMenu jm = new JMenu("Options");
            mBar.add(jm);
     
            // Change the client
            ActionListener actionOption = new ActionOption();
            JMenuItem menuClient = new JMenuItem("Open dialog box...");
            menuClient.addActionListener(actionOption);
            jm.add(menuClient);
    	}
     
    	class ActionOption implements ActionListener {
    		public void actionPerformed( ActionEvent e ) {
    			OptionDlg dlg = new OptionDlg(frame, "Dialog box");
    	    }
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    package combo1;
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class OptionDlg extends JDialog {
     
    	private static final long serialVersionUID = -1;
     
    	public OptionDlg(Frame frame, String title) {
    		super(frame, title);
     
    		Container container = getContentPane();
    	    container.setLayout(new BorderLayout());
    	    setSize(500, 320);
    		setResizable(false);
     
    	    Dimension dim = getToolkit().getScreenSize();
    		setLocation(dim.width/3, dim.height/3);
     
    	    init(container);
     
    	    setModal(true);
    		setVisible(true);
    	}
     
    	private void init(Container container) {
    	    ActionOption action = new ActionOption();
     
    		DefaultComboBoxModel comboModelTest = new DefaultComboBoxModel();
    		String[] Tests = {"Test 1", "Test 2",
    			    "Test 3", "Test 4", "Test 5",
    			    "Test 6", "Test 7", "Test 8",
    			    "Test 9", "Test 10", "Test 11", 
    			    "Test 12", "Test 13", "Test 14", 
    			    "Test 15", "Test 16" };
     
    		for(int i = 0 ; i < 16 ; i++) {
    			comboModelTest.addElement(Tests[i]);
    		}
     
    		JComboBox comboTest = new JComboBox(comboModelTest);
    		comboTest.setSelectedIndex(0);
     
    		Dimension dim = new Dimension(80, 30);
    	    JButton okButton = new JButton("OK");
    	    okButton.setPreferredSize(dim);
    	    okButton.addActionListener(action);
     
    		JPanel panel1 = new JPanel();
    		panel1.add(comboTest);
    		JPanel panel2 = new JPanel();
    		panel2.add(okButton);
     
    	    container.add(panel1, BorderLayout.CENTER);
    	    container.add(panel2, BorderLayout.SOUTH);
    	}
     
    	class ActionOption implements ActionListener {
    		public void actionPerformed( ActionEvent e ) {
    			dispose();
    	    }
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <html>
    <body>
    <applet code=combo1.mainApplet.class width="100%" height="100%" >
    </applet>
    </body>
    </html>

  2. #2
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    il semblerait que ca soit un probleme de focus (quand je clique en dehors de la fenetre et que je reviens, l'utilisation de la combobox se fait normalement).
    Donc j'ai essaye de voir avec les methodes suivantes :

    setModal(true);
    setVisible(true);
    setFocusable(true);
    requestFocusInWindow();
    requestFocus();

    Mais le resultat n'est pas convainquant (Ca fonctionne plus souvent si la boite de dialogue n'est pas modale).

    Est ce que quelqu'un a une idee?

    Merci,

    Tof

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Petite precision : j'utilise IE 7.0. Et pour mon code java j'ai le jdk 1.6.
    Est ce que quelqu'un a essaye?

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    J'ai reduit le code au maximum, j'ai fait le tour des forums.. Pas de solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import java.awt.Frame;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class MainClass extends JApplet {
     
    	Frame frame = (Frame)SwingUtilities.getAncestorOfClass(Frame.class, this);
     
    	public MainClass() {
    		super();
    	}
     
    	public void init() {
    		JMenuBar mBar = new JMenuBar();
    		setJMenuBar(mBar);
    		JMenu jm = new JMenu("Option");
    		mBar.add(jm);
    		ActionListener actionOption = new ActionOption();
    		JMenuItem menuClient = new JMenuItem("Open dialog box...");
    		menuClient.addActionListener(actionOption);
    		jm.add(menuClient);
     
    		this.setVisible(true);
    	}
     
    	class ActionOption implements ActionListener {
    		public void actionPerformed( ActionEvent e ) {
    			JDialog dial = new JDialog(frame, "test", true);
    			String[] Tests = {"Test 1", "Test 2", "Test 3", "Test 4", "Test 5"};
    			dial.getContentPane().add(new JComboBox(Tests));
    			dial.setSize(100, 100);
     
    			dial.setVisible(true);
    		}
    	}
    }

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Bon, j'ai plusieurs remarques relatives à ton code :
    1. Tu utilises du Swing (JApplet, JComboBox, ...) et du AWT (Frame). C'est pas super. Faut changer ça. Avec le point 3, ce sera résolu.
    2. Tu appelles un setVisible(true) sur une applet. Je ne crois pas que ce soit recommandé. Je ne sais même pas si c'est correct. C'est une méthode venant de JComponent et jamais réécrite dans l'arbre des classes de JApplet.
    3. Pour ton dialogue, il existe un constructeur JDialog(Window, ...) qui sera celui que tu utilises (puisque JApplet étend à 2 degrés Window et non Frame). Vire donc tous les appels zarbs nécessaires à Frame, et crée ton dialogue en faisant new JDialog(this, "titre", true).

    Si tu résouds déjà ceci, je crois qu'on y verra plus clair et on pourra t'aider plus en détail. D'ailleurs, il est possible que ça résolve ton souci

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci pour cette reponse.
    Pour ne pas melanger AWT et SWING tu conseilles de faire comme ca :

    Pas possible avec this

    new JDialog(this, "titre", true);

    Donc plutot quelque chose comme ca?

    Window owner = (Window)this.getParent();
    new JDialog(owner, "titre", true);

    J'ai retire le setVisible(true) sur l'applet. mais ce ne change rien. Le probleme vient du fait que la boite de dialogue est modale.

    Je cherche donc l'exemple le plus simple possible pour ouvrir une boite de dialogue modale contenant une combobox dans une applet.
    Tout se passe bien lors de la premiere ouverture, c'est pendant les suivantes qu'il y a un probleme.

    Je continue a investiguer...

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    N'utilise surtout pas le getParent(). Ca peut te renvoyer n'importe quoi dans une JApplet. Ce que je te conseille, c'est de ne pas utiliser AWT et swing ensemble. Mais parfois, des composants d'AWT sont nécessaires à l'utilisation de composants Swing. C'est le cas de la création de JDialog. Dans ce cas, tu limites au maximum ceci. Et puis, si on y réfléchit, qui appelle la JDialog ? Ton applet ou la fenêtre contenant ton applet ? Si tu réponds la seconde solution, c'est que tu réfléchis trop : la JDialog est bien dépendante de ton applet et non d'une fenêtre dont tu ne maîtrises rien.

    Pour le "pas possible avec this", tu as tout à fait raison : j'ai lu la doc en diagonale. Je vais toutefois me permettre de te poser une question. As-tu réellement besoin d'avoir un dialogue modal ? Un JOptionPane assez bien personnalisé ne suffit-il pas ? Sinon, tu as besoin de Java 6 et du constructeur JDialog(Window, String, Dialog.ModalityType).

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    En fait j'aimerais ouvrir une boite de dialogue modale dans mon applet a partir d'un menu.
    Il faut donc que j'utilise ce constructeur : JDialog(Window, String, Dialog.ModalityType). Mais comment retrouver le premier parametre dans mon applet?
    Le seul souci est l'affichage de mes combobox qui ne se fait pas toujours correctement (sans doute un probleme de focus).

  9. #9
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    J'ai pas trouve de solution pour avoir une combobox dans une boite de dialogue modale ouverte dans une applet swing.
    (probleme de focus et d'affichage de la combo box correctement, le probleme ne se produit pas toujours).
    Je ne peux pas passer plus de temps dessus, j'ai donc remplace ma combobox par une listbox inclue dans un scrollpanel.

    Tof

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/06/2014, 03h01
  2. Affichage d'un objet matrice dans une boite de dialogue
    Par FATENMRABET dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 14/12/2013, 21h31
  3. affichage de données dans une boite de dialogue
    Par Invité dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 20/07/2009, 10h20
  4. Affichage composants dans une boite de dialogue.
    Par argon dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 13/02/2007, 21h52
  5. Réponses: 3
    Dernier message: 10/10/2006, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo