2013-06-26 3 views
1

J'essaie de travailler avec des gestionnaires de disposition pour la première fois, et ils me donnent des coups de pied dans les dents. J'essaie de faire une image de fond et ensuite mettre des boutons sur le dessus, en utilisant GridBagLayout, s'il y a un meilleur layoutmanager, s'il vous plaît dites-le. Quant à essayer d'apprendre à utiliser les gestionnaires de mise en page, ses références très difficiles et tout apprentissage seraient également très appréciés. This is whats it looks like currently C'est ce qu'il ressemble à l'heure actuelle, je peux Préparons le cadre pour afficher l'image complète, mais quand j'utiliser le gestionnaire GridLayout, il le faitComment mettre une image de fond sur GridBagLayout

public void addComponentsToPane(Container pane){ 
    BackgroundImage image = new BackgroundImage(); 
    JButton button1, button2, button3, button4, button5; 
    pane.setLayout(new GridBagLayout()); 

    GridBagConstraints c = new GridBagConstraints(); 

    if(shouldFill){ 
     c.fill = GridBagConstraints.NONE; 
    } 
    button1 = new JButton("Button 1"); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 1; 
    c.gridy = 0; 
    button1.setOpaque(false); 
    pane.add(button1, c); 


    button2 = new JButton("Button 2"); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.weightx = 0.5;  
    c.gridx = 0; 
    c.gridy = 0; 
    button2.setOpaque(false); 
    pane.add(button2, c); 

    button3 = new JButton("Button 3"); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.weightx = 0.5; 
    c.gridx = 2; 
    c.gridy = 0; 
    button3.setOpaque(false); 
    pane.add(button3, c); 

    button4 = new JButton("Long-Named Button 4"); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.ipady = 40;  //make this component tall 
    c.weightx = 0.0; 
    c.gridwidth = 3; 
    c.gridx = 0; 
    c.gridy = 1; 
    pane.add(button4, c); 
    button5 = new JButton("button 1"); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.ipady = 0;  //reset to default 
    c.weighty = 1.0; //request any extra vertical space 
    c.anchor = GridBagConstraints.PAGE_END; //bottom of space 
    c.insets = new Insets(10,0,0,0); //top padding 
    c.gridx = 1;  //aligned with button 2 
    c.gridwidth = 2; //2 columns wide 
    c.gridy = 2;  //third row 
    pane.add(button5, c); 
    c.ipadx = 800; 
    c.ipady = 400; 
    pane.add(image, c); 

} 

This is what i'm trying to get it to look like C'est ce que je suis en train de faire ressembler

Répondre

4

Vérifiez la Background Panel pour un couple de solutions en fonction de vos besoins:

  1. Utilisez un JLabel pour pai l'image à sa taille réelle.
  2. Utilisez le BackgroundPanel pour permettre la mise à l'échelle de l'image d'arrière-plan.
5

Voici une façon de le faire: utiliser un JLabel comme contenant une image (il est un peu inhabituel, mais fonctionne en fait assez bien):

import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.swing.Box; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class TestBackgroundImage { 

    private static final String BACKHGROUND_IMAGE_URL = "http://www.okyn.org/wp-content/uploads/2013/04/League_of_Legends.jpeg"; 

    protected void initUI() throws MalformedURLException { 
     JFrame frame = new JFrame(TestBackgroundImage.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final ImageIcon backgroundImage = new ImageIcon(new URL(BACKHGROUND_IMAGE_URL)); 
     JLabel mainPanel = new JLabel(backgroundImage) { 
      @Override 
      public Dimension getPreferredSize() { 
       Dimension size = super.getPreferredSize(); 
       Dimension lmPrefSize = getLayout().preferredLayoutSize(this); 
       size.width = Math.max(size.width, lmPrefSize.width); 
       size.height = Math.max(size.height, lmPrefSize.height); 
       return size; 
      } 
     }; 
     mainPanel.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.insets = new Insets(10, 10, 10, 10); 
     gbc.weightx = 1.0; 
     gbc.anchor = GridBagConstraints.WEST; 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     for (int i = 0; i < 5; i++) { 
      mainPanel.add(new JButton("Button " + (i + 1)), gbc); 
     } 
     // Let's put a filler bottom component that will push the rest to the top 
     gbc.weighty = 1.0; 
     mainPanel.add(Box.createGlue(), gbc); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        new TestBackgroundImage().initUI(); 
       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 

Et le résultat:

enter image description here

  • GridBagLayout est incapable de gérer la superposition des composants (donc si vous avez chevauchement gridx/gridy paires, il ne va pas gérer comme la superposition, je pense que la sortie est à peu près indéterminée. Essayez d'éviter d'utiliser gridx/gridy car cela rend le code difficile à maintenir. Jouer avec des valeurs relatives sur gridwidth/gridheight est beaucoup plus facile à maintenir.
+0

Quelle est la raison de la méthode OverPiding mainPanel, getPreferredSize? Est-ce une solution efficace? Aussi, quels sont les encarts? – Loligans

+1

Le composant sert vraiment à deux fins, 1) pour afficher une image et 2) en tant que conteneur pour contenir divers composants. La taille préférée du composant a donc été modifiée pour utiliser les plus grandes valeurs de hauteur ou de largeur de la taille préférée de 1 ou 2. – camickr

+0

@Loligans Raison du remplacement de prefsize: voir l'explication de camickr (oui c'est efficace). Insets est le remplissage externe du composant (voir 'GridBagConstraint' javadoc). –

Questions connexes