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);
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);
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
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é.
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);
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