2017-02-07 1 views
0

J'ai étudié Java à mon université, je suis assez nouveau mais j'essaie de faire de mon mieux pour m'améliorer. J'essaie de créer une interface graphique qui affiche une grille de Grass Tiles (en utilisant JLabels avec des icônes Grass), mais je veux ajouter d'autres icônes sur le dessus de l'herbe (icônes de caractères) afin que je puisse voir un personnage debout sur l'herbe. J'ai pensé que je pourrais le faire en utilisant JLayeredPane et ajouter un autre JLabel au même endroit mais avec une priorité de couche plus élevée, mais cela ne semble pas fonctionner. Des conseils sur ce que je devrais faire?Ajout d'un JLabel avec une icône d'arrière-plan transparent sur un autre JLabel et affichage des deux

Merci :)

EDIT: j'ai réussi à le faire en utilisant MigLayout et l'instruction setOpaque (false). Merci pour vos réponses :)

+2

Il y a un certain nombre de façons de le faire. Vous pouvez appliquer un gestionnaire de disposition aux étiquettes d'herbe, de sorte que vous pouvez leur ajouter des composants, de cette façon vous pouvez utiliser un GridLayout simplement pour afficher les carreaux d'herbe ou vous pouvez créer un composant personnalisé qui peint son arrière-plan avec l'image herbe. encore une fois, en ajoutant un gestionnaire de disposition pour que vous puissiez ajouter des composants. Les deux ont des mérites, le panneau personnalisé est plus compliqué, mais vous donne plus de contrôle sur la taille du composant, l'étiquette est plus simple, mais ne sera jamais la taille de l'icône, pas son contenu – MadProgrammer

+0

C'est bien si les étiquettes sont les taille de l'icône. Si vous avez le temps, pourriez-vous s'il vous plaît poster un exemple de code pour cela? –

+0

Au lieu de modifier votre question avec "J'ai résolu ceci par ...", veuillez ajouter une réponse à votre question (y compris le code sous la forme d'un [mcve]) afin que tous ceux qui viennent voir cette question à l'avenir pour le faire s'ils viennent avec un problème ou une question similaire. @MadProgrammer n'a pas publié un exemple de code pour cela parce que vous n'avez posté aucun code pour travailler avec, mais voici quelques [exemples] (http://stackoverflow.com/questions/19125707/simplest-way-to-set-image- as-jpanel-background) et [ici] (http://stackoverflow.com/questions/1466240/how-to-set-an-image-as-a-background-for-frame-in-swing-gui-of -java) – Frakcool

Répondre

0

Ceci est un fragment du code que j'ai utilisé pour résoudre ce problème.

private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 457, 330); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JLayeredPane panel = new JLayeredPane(); 
    panel.setBounds(0, 0, 457, 330); 
    frame.getContentPane().add(panel); 
    panel.setLayout(null); 

    JPanel background = new JPanel(); 
    background.setBounds(0, 0, 457, 330); 
    panel.add(background); 
    background.setLayout(new MigLayout("","","")); 
    //In my particular problem I used some constraints, but they're not needed 

    backgroundLabels = new JLabel[NCOLS][NROWS]; 
    for (int i = 0; i < NCOLS; i++) 
     for (int j = 0; j < NROWS; j++) { 
      backgroundLabels[i][j] = new JLabel(backgroundIcon); 
      //Assuming you have a backgroundIcon variable where you saved your icon 
      background.add(backgroundLabels[i][j], "cell " + i + " " + j); 
     } 

    JPanel characterPanel = new JPanel(); 
    panel.setLayer(characterPanel, 1); 
    characterPanel.setBounds(0, 0, 457, 330); 
    panel.add(characterPanel); 
    characterPanel.setOpaque(false); 
    characterPanel.setLayout(new MigLayout("","","")); 

    characterLabels = new JLabel[NCOLS][NROWS]; 
    for (int i = 0; i < NCOLS; i++) 
     for (int j = 0; j < NROWS; j++) { 
      characterLabels[i][j] = new JLabel(""); 
      //Creates empty character labels. You can then add icons using setIcon() 
      characterPanel.add(characterLabels[i][j], "cell " + i + " " + j); 
     } 

} 
+0

'setLayout (null)' et 'setBounds()' sont de mauvaises pratiques, vous mélangez 'null-layout' avec [layout managers] (https://docs.oracle.com/javase/tutorial/uiswing /layout/visual.html), veuillez rester avec les gestionnaires de disposition seulement. Lire [mise en page nulle est le mal] (http://www.leepoint.net/GUI/layouts/nulllayout.html) et les réponses dans [cette question] (http://stackoverflow.com/questions/6592468/why-is -it-frown-on-use-a-null-layout-en-swing) – Frakcool