Comment définir l'emplacement d'une image dans une JFrame
Je suis en train de définir l'emplacement d'une image dans une JFrame. J'ai pensé étiquette.setLocation(100, 100); permettrait de définir l'emplacement de l'image à 100, 100 (coin supérieur gauche), mais il ne semble pas à faire n'importe quoi n'importe étaient je l'ai mis. J'ai même essayé de panal.setLocation(100, 100). Les deux ne rien faire, je reçois pas d'erreurs et la image ne s'affiche mais à 0, 0. Que suis-je doning mal? Voici mon code:
import javax.swing.*;
public class DisplayImage {
public DisplayImage() {
JFrame frame = new JFrame("Display Image");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = (JPanel)frame.getContentPane();
JLabel label = new JLabel();
label.setIcon(new ImageIcon("src/img/school.png"));
label.setLocation(100, 100);
panel.add(label);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}
public static void main (String args[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DisplayImage();
}
});
}
}
- Java Interfaces utilisateur peut avoir à travailler sur un certain nombre de plates-formes, sur différentes résolutions d'écran & à l'aide de différents PLAFs. En tant que tels, ils ne sont pas propices à l'exact du placement des composants. Pour un solide GUI, au lieu d'utiliser les gestionnaires de mise en page, ou une combinaison d'entre eux, avec mise en page rembourrage & les frontières de l'espace vide, d'organiser les composants.
- ..Voir cette réponse pour une démo.
Vous devez vous connecter pour publier un commentaire.
Par défaut une JFrame utilise un BorderLayout. Lorsque vous ajoutez votre étiquette à l'image de l'étiquette est ajoutée au CENTRE de la BorderLayout. Le layout manager va se substituer à l'emplacement.
Une solution simple est d'ajouter une EmptyBorder de l'étiquette avec le haut/gauche encarts de 100. Alors, au lieu d'ajouter l'étiquette vers le centre, vous devez ajouter l'étiquette vers le NORD. Le code serait quelque chose comme:
En règle générale, vous ne devriez pas essayer de préciser l'emplacement exact d'un composant. Laissez à la disposition des gestionnaires pour leurs emplois.
La
JFrame
, par défaut, utilise unBorderLayout
comme c'est le gestionnaire de configuration. Cela va remplacer tous les paramètres d'alimentation à l'setLocation
méthode.Vous avez un certain nombre d'options...
JLayeredPane
, qui n'a pas, mais par défaut, ont layout manager de sa propre valeur par défaut. Voir Comment utiliser les couches volets pour plus de détailsCela fonctionne pour moi:
Mais vous devriez lire ceci:
http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html
null
mise en page n'est jamais approprié de la suggestion. Le problème est qu'il ya beaucoup de code de gestion entourant la mise à jour des conteneurs, y compris des choses commepreferred/minimum/maximum/Size
qui permet à d'autres gestionnaires de disposition à prendre des décisions sur la meilleure façon de répondre aux changements dans l'environnement. Vous pouvez également trouver que des plates-formes différentes ont différentes indicateur de performance et des métriques de police qui sera en effet comment ces composants sont disposés - à mon humble avissetLayout(null);
Pourquoi développer pour vous? Ce sera probablement se briser sur la prochaine machine, PLAF, .. -1@
est important) pour les informer d'un nouveau commentaire.null
mises en page, c'est que la prochaine question de l'OP va se poser est "pourquoi ne contenant pas montrer", la réponse est,null
mise en page...c'est un cercle vicieux qui est juste à éviter tandis que le peuple de l'apprentissage de la Balançoire...à mon humble avis