web-dev-qa-db-fra.com

Mise en page Java Swing JFrame

Je viens d'écrire un code simple dans lequel je veux qu'un champ de texte et un bouton apparaissent sur le cadre principal, mais après avoir exécuté tout ce que je vois, c'est le champ de texte.

Si j'écris le code du bouton après le champ de texte, seul le bouton est affiché.

Une idée pourquoi?

    JFrame mainframe=new JFrame();
    mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainframe.setBounds(0,0,200,200);
    JButton jb=new JButton();
    jb.setText("Leech");
    mainframe.add(jb);
    JTextField link=new JTextField(50);
    mainframe.add(link);
    mainframe.pack();
    mainframe.setVisible(true);
10
DanMatlin

Ajoutez vos composants à un JPanel, puis ajoutez ce panneau au ContentPane de JFrame.

JFrame window = new JFrame();
JPanel mainframe = new JPanel();

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setBounds(0,0,200,200);

JButton jb = new JButton();
jb.setText("Leech");

mainframe.add(jb);

JTextField link = new JTextField(50);
mainframe.add(link);

window.getContentPane().add(mainframe);
window.pack();
window.setVisible(true);
5
Ibrahim

La disposition par défaut sur une JFrame est une BorderLayout. L'appel de la méthode add sur une Container avec une telle disposition équivaut à un appel add(..., BorderLayout.CENTER). Chacun des emplacements de la BorderLayout ne peut contenir qu'un seul élément. Donc faire deux appels

mainframe.add(jb);
mainframe.add(link);

résulte dans un CENTRE contenant le dernier composant que vous avez ajouté. Si vous souhaitez éviter cela, vous pouvez l'ajouter à différents emplacements ou utiliser un autre gestionnaire de présentation (par exemple, une FlowLayout) en appelant JFrame#setLayout

11
Robin

Au lieu d'ajouter directement des composants à l'image JFrame, utilisez un JPanel en tant que conteneur avec le LayoutManager souhaité.

Ici vous pouvez trouver plusieurs tutoriels sur les gestionnaires de disposition.

En gros, dans Swing, LayoutManager est responsable de la disposition des composants enfants (définissant leur position et leur taille), de sorte que chaque composant de conteneur que vous utilisez dans votre application doit être configuré avec le logiciel LayoutManager approprié.

9
Heisenbug

Le gestionnaire de disposition par défaut de JFrame est BorderLayout. Si vous voulez la mise en page automatique, vous pouvez utiliser FlowLayout:

mainframe.setLayout(new FlowLayout());

Si vous voulez spécifier les coordonnées avec la méthode setBounds (), vous devez annuler le paramétrage du gestionnaire de disposition sur JFrame:

mainframe.setLayout(null);
jb.setBounds(10,10,100,50);
link.setBounds(10,70,180,100);
0
guest

si vous voyez la documentation BorderLayout mainframe.add (jb); est égal à mainframe.add (jb, BorderLayout.CENTER); mainframe.add (lien); est égal à mainframe.add (jb, BorderLayout.CENTER);

donc il montre juste le dernier

0
John Dadi Leop