web-dev-qa-db-fra.com

Menu déroulant simple en Java

Je travaille sur une interface graphique très simple en Java.

Dans cette interface graphique, je veux afficher:

  1. Une étiquette avec du texte en haut de la page
  2. Un JComboBox sous le label mentionné
  3. Un JButton sous le JComboBox mentionné

Voici mon code:

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Prova {

public static void main(String[] args) {

    JFrame frame = new JFrame("A Simple GUI");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 500);
    frame.setLocation(430, 100);

    JPanel panel = new JPanel();

    frame.add(panel);

    JLabel lbl = new JLabel("Select one of the possible choices and click OK");
    lbl.setVisible(true);

    panel.add(lbl);

    String[] choices = { "CHOICE 1","CHOICE 2", "CHOICE 3","CHOICE 4","CHOICE 5","CHOICE 6"};

    final JComboBox<String> cb = new JComboBox<String>(choices);

    cb.setVisible(true);
    panel.add(cb);

    JButton btn = new JButton("OK");
    panel.add(btn);

    }
}

Malheureusement, le résultat obtenu est

image

Comme vous pouvez le voir sur l'image, l'étiquette, le JComboBox et le JButton sont sur la même ligne!

Au lieu de cela, je les veux "empilés" comme décrit ci-dessus:

JLabel

JComboBox

JButton

J'ai essayé d'utiliser la méthode setLocation (int x, int y), mais elles apparaissent toujours à la même position.

Merci beaucoup!

10
NoobNe0

utilisez frame.setLayout(null); cela vous permettra de placer l’étiquette, le bouton, etc. où vous le souhaitez

6
Nerakai

Vous devez utiliser l'un des modèles standard Java (GridLayout, LinearLayout, BoxLayout).

Je recommande d'utiliser une grille avec 1 colonne et 3 lignes

comme ci-dessous

  setLayout(new GridLayout(1,3));
         add(new Button("1"));
         add(new Button("2"));
         add(new Button("3"));
4
Ahmed Salem

C'est dû à la disposition qui est utilisée pour aligner les enfants. Par défaut, son FlowLayout, qui contient tous les composants enfants dans un flux allant de gauche à droite, donne l'affichage ci-dessus.

Vous pouvez utiliser un GridLayout avec 3 lignes et 1 colonne selon vos besoins.

Disposition de la grille

Toutes les mises en page

3
Atul O Holic

Si j'ai bien compris votre question, le code suivant accomplit ce que vous essayez de faire sans être trop compliqué:

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.BoxLayout; // added code
import Java.awt.Component; // added code

public class Prova {

public static void main(String[] args) {

    JFrame frame = new JFrame("A Simple GUI");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 500);
    frame.setLocation(430, 100);

    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); // added code

    frame.add(panel);

    JLabel lbl = new JLabel("Select one of the possible choices and click OK");
    lbl.setAlignmentX(Component.CENTER_ALIGNMENT);
    //lbl.setVisible(true); // Not needed

    panel.add(lbl);

    String[] choices = { "CHOICE 1", "CHOICE 2", "CHOICE 3", "CHOICE 4",
                         "CHOICE 5", "CHOICE 6" };

    final JComboBox<String> cb = new JComboBox<String>(choices);

    cb.setMaximumSize(cb.getPreferredSize()); // added code
    cb.setAlignmentX(Component.CENTER_ALIGNMENT);// added code
    //cb.setVisible(true); // Not needed
    panel.add(cb);

    JButton btn = new JButton("OK");
    btn.setAlignmentX(Component.CENTER_ALIGNMENT); // added code
    panel.add(btn);

    frame.setVisible(true); // added code

    }
}

La méthode setLocation est souvent trop compliquée à moins d’avoir des objectifs très spécifiques (artistiques?) Pour la mise en page. Pour ce problème, une solution plus simple consiste à utiliser BoxLayout et à spécifier que vous souhaitez ajouter des éléments dans la direction y (verticalement vers le bas). Notez que vous devrez spécifier les dimensions de JComboBox vouloir ajouter plus tard) pour éviter un menu déroulant géant. cf. un autre article stackoverflow, JComboBox width

1
bballdave025

Étudiez quelques tutoriels sur l’utilisation des gestionnaires de disposition, c’est là que vous trouverez la solution. Ils sont assez difficiles cependant.

1
Taerus