6
votes

Pas capable de définir l'emplacement de Jlabel sur un JPanel

J'ai mis l'emplacement (0,0) pour le Jlabel par rapport à la JPANEL. Mais il se détache au centre et au sommet. Quelle erreur je fais?

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*;
public class Main extends JFrame 
{ 
private JPanel panel;
private JLabel label1;
public Main() 
{ 
    panel = new JPanel(); 
    panel.setBackground(Color.YELLOW); 

    ImageIcon icon1 = new ImageIcon("3.png"); 
    label1 = new JLabel(icon1); 
    label1.setLocation(0,0); 
    panel.add(label1);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane().add(panel); 
    this.setSize(500,500); 
    this.setVisible(true); 

} 

public static void main (String[] args) {
    new Main(); 
} 
} 


2 commentaires

Il n'y a absolument aucun moyen d'apprendre tout sur layoutManagers, f.i. Dans docs.oracle.com/javase/tatutorial/uiswing/layout/index .html


+1 pour le SSCCE. Il a facilité la tâche de sauter rapidement et d'aider à soutenir la bonne réponse (avec une capture d'écran;).


6 Réponses :


2
votes

Vous ne pouvez pas définir l'emplacement absolu d'un composant tandis que son conteneur a un LayoutManager ; Vous devez appeler setlayout (null) sur le jPanel avant que cela fonctionne.


7 commentaires

Ou vous devriez apprendre quelles mises en page sont disponibles ici ici Didacticiel de présentation Oracle


Pourquoi: LayoutAutManager remplacera toujours l'emplacement lors de la mise en place du contenu du composant (lorsque le composant est visible, par exemple)


Je suppose que ce qu'il dit, de manière maladroite, est qu'il serait préférable d'utiliser un gestionnaire de mise en page que de positionnement absolu, comme dans la réponse de @ Alexr. Dans ce cas particulier, je viens de répondre à la question qui a été posée, mais bien sûr, il est vrai que ce n'est pas la meilleure façon de faire les choses.


"Call Setlayout (NULL) .. avant que cela fonctionnera." montre-moi le cas où un null mise en page Travail (dans un X-plat., X-Plaf., UI redimensionnable).


OK, @ Andrewthompson - Dans une application GUI Builder, où vous positionnez des composants en les faisant glisser.


@ Ernestfriedman-Hill: N'utilisez-ils pas grouplayout pour cela, lorsque vous les faites glisser et les positionner dans des constructeurs d'interface graphique? Eh bien, je ne suis pas sûr, mais une mise en page roule sur le backend. N'avait essayé aucun constructeur d'interface graphique.


"Vous positionnez des composants en les traînant." allez-vous faire cela sur l'ordinateur de l'utilisateur final, quand ils changent le PLAF, redimensionnent l'interface graphique et tout tombe en morceaux? Vous semblez manquer (ou ignorer) les contraintes que j'ai définies. Voir Selayout (NULL) n'est jamais nécessaire. Jamais! pour mes vues supplémentaires (certains méconnus folks pourraient appeler cela un «rant») sur le sujet.



3
votes

Vous ne pouvez pas faire cela car le gestionnaire de présentation par défaut se soucie de ralentir des éléments dans votre panneau.

Si vous voulez vraiment définir l'élément sur la position, vous choisissez Dites Panel = New JPanel (NULL);

mais attendez un moment! Voulez-vous vraiment faire cela? Je crois que tu ne le fais pas. Nous (programmeurs Java) utilisons généralement le service fourni par les gestionnaires de mise en page pour rendant des éléments à l'écran. Vous devez passer une heure pour apprendre et comprendre le concept, puis je vous promets que vous utiliserez cette technique et oubliez le rendu manuel des éléments à l'écran comme aboutant un très mauvais rêve.


1 commentaires

Fondamentalement, je veux que l'image suive l'emplacement de la souris. Ensuite, je dois définir la mise en page à NULL, non?



1
votes

En écrivant

panneau = nouveau JPanel ();

Vous forcez le panneau pour utiliser FlowLayout qui ajoute des éléments en ligne. Vous pouvez utiliser

Panneau = New JPanel (NULL);

Si vous voulez gagner plus de performances en désactivant le gestionnaire de flowlayout, mais en le faisant, vous devez prendre soin de la méchante chose, comme le lieu des composants, les dimensions, etc. Je pense qu'il est préférable d'utiliser Directout Managers


3 commentaires

Veuillez suggérer, envisagez toujours de définir la mise en page à NULL comme dernière étape, ce qui pourrait ne jamais arriver réellement. Comme quelqu'un derrière les scènes travaille dur pour faire fonctionner des mises en page pour chaque besoin spécifique d'un utilisateur. +1 pour cette information modifiée cependant :-)


Dans votre profil, on dirait que vous vouliez écrire un étudiant en informatique, mais j'avais écrit un ordinateur depuis l'étudiant. Corrigez-vous si je suis juste :-)


Lol, bien sûr, je voulais dire que je suis étudiant en informatique.



8
votes

Définition du gestionnaire de mise en page sur null n'a pas fonctionné pour moi. Essayez ceci: XXX

Voil! :) Je vous recommande d'examiner le nouveau relativenelayout manager.


5 commentaires

FlowLayout n'est-il pas par défaut pour JPanel? Alors pourquoi dois-je la remettre à nouveau?


@Johnwatson: Oui, c'est et non, vous ne le faites pas.


Le flowLayout par défaut est le centre aligné. Notez que l'argument est transmis au constructeur ci-dessus qui la définit à gauche aligné.


@Andrewthompson Et si j'ai besoin de l'image pour suivre la souris, quelle mise en page doit être utilisée?


".. besoin de l'image pour suivre la souris" peinture personnalisée. La disposition (ou le manque de celui-ci) n'est pas pertinent. Demandez une question séparée et je vais montrer comment vous pouvez combiner une image BG peinte personnalisée qui suit la souris, avec des composants qui sont disposés sur le dessus.



9
votes

Utilisez des mises en page!

Capture d'écran de l'icône d'image alignée gauche xxx < / PRE>


MISE À JOUR

Il semble y avoir beaucoup de confusion parmi les réponses à ce fil, afin de clarifier une matière:

  • A jPanel a un flowlayout par défaut.
  • Le flowlayout IT obtient, vient du constructeur "No Args", par ex. NOREFERRER"> Nouvelle FlowLayout ( ) 1 .
  • Le constructeur no-args pour un flowlayout produit ..

    (1) ..a nouvelle flowlayout avec un alignement alignement centré et un écart horizontal et vertical de 5 unités par défaut.


3 commentaires

Pourquoi la mise en page du panneau doit-elle être définie lorsque vous par défaut, il s'agit d'une mise en page?


Qu'en est-il de si je veux l'image au centre du panneau?


1) Voir la modification. 2) Utilisez le constructeur No-Args (par exemple un panneau par défaut).



1
votes
setLayout(null); //set your frame layout to null for abs. positioning
yourPanel = new JPanel(); // create your JPanel
yourPanel.setLayout(null); // set the layout null for this JPanel !

text1 = new JLabel("SB"); // create some stuff
text2 = new JLabel("BB");

yourPanel.add(text1); // add the stuff to the JPanel
yourPanel.add(text2);
yourPanel.getComponent(0).setBounds(0,0, 20, 20); // set your position of your elements inside your JPanel
yourPanel.setBorder(BorderFactory.createLineBorder(Color.black)); // set a testing border to help you position the elements better
yourPanel.setBounds(30, 200, 750, 220); // set the location of the JPanel
//leave me a reply

0 commentaires