2 votes

Mise en page avec des boutons JButtons à hauteur fixe et à largeur variable

Je cherche un LayoutManager qui possède des boutons JButtons de hauteur fixe qui s'étendent en largeur pour s'adapter à la taille de leur conteneur. Au-dessus des boutons JButtons, il devrait y avoir un JLabel sur la ligne qui dit "Choose file :". Ceci est destiné à fonctionner comme un accessoire d'un JFileChooser qui permet à l'utilisateur de choisir des fichiers récents. Je n'ai pas réussi à le faire apparaître correctement, j'ai essayé d'utiliser plusieurs JPanels et des LayoutManagers tels que BoxLayout. Lorsque j'utilise BoxLayout, les boutons JB ne s'étendent que dans la mesure où ils doivent contenir leur texte, mais j'aimerais que tous les boutons JB aient la même largeur afin qu'ils n'aient pas l'air bizarre.

Remarque : j'ai également utilisé d'autres gestionnaires de mise en page tels que Border et GridLayout, mais ils ignorent la plupart du temps mes paramètres de taille et ne sont pas assez sophistiqués, semble-t-il. Je dois faire cela à la main, Netbeans etc. n'est pas une option.

Exemple fonctionnel, mais visuellement incorrect

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Chooser extends JPanel {

    public Chooser(){
        this.setLayout(new GridLayout(0,1));

        JPanel labelPanel = new JPanel();
        JLabel label = new JLabel("Choose a file:");
        labelPanel.add(label);
        labelPanel.setBackground(Color.red);

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JButton("long pathname to a file goes here"));
        buttonPanel.setBackground(Color.blue);

        this.add(labelPanel);
        this.add(buttonPanel);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Chooser c = new Chooser();
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setAccessory(c);
        fileChooser.showOpenDialog(null);
    }

}

6voto

Hovercraft Full Of Eels Points 161146

Qu'en est-il de quelque chose où un GridLayout est imbriqué dans un BorderLayout (en fait dans un JScrollPane)...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Chooser extends JPanel {
   private static final String[] BUTTON_TEXTS = { "Hello", "Goodbye",
         "Hello Goodbye", "Adios", "This is a long String for WTF" };

   public Chooser() {
      this.setLayout(new BorderLayout());

      JPanel labelPanel = new JPanel();
      JLabel label = new JLabel("Choose a file:");
      labelPanel.add(label);
      labelPanel.setBackground(Color.red);

      JPanel buttonPanel = new JPanel(new GridLayout(0, 1));
      for (int i = 0; i < BUTTON_TEXTS.length; i++) {
         buttonPanel.add(new JButton(BUTTON_TEXTS[i]));
      }
      buttonPanel.add(Box.createVerticalGlue()); // to pad the bottom if needed
      buttonPanel.setBackground(Color.blue);

      this.add(labelPanel, BorderLayout.PAGE_START);
      this.add(new JScrollPane(buttonPanel), BorderLayout.CENTER);
   }

   public static void main(String[] args) {
      Chooser c = new Chooser();
      JFileChooser fileChooser = new JFileChooser();
      fileChooser.setAccessory(c);
      fileChooser.showOpenDialog(null);
   }

}

Exemple 2 avec une simple JList qui place sa sélection dans le sélecteur de fichiers :

import java.awt.*;
import java.io.File;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Chooser extends JPanel {
   private static final String[] BUTTON_TEXTS = { "Hello", "Goodbye",
         "Hello Goodbye", "Adios", "This is a long String for WTF", "Hello",
         "Goodbye", "Hello Goodbye", "Adios", "This is a long String for WTF" };

   public Chooser(final JFileChooser fileChooser) {
      setLayout(new BorderLayout());

      JPanel labelPanel = new JPanel();
      JLabel label = new JLabel("Choose a file:");
      labelPanel.add(label);
      labelPanel.setBackground(Color.red);

      final JList list = new JList(BUTTON_TEXTS);
      list.addListSelectionListener(new ListSelectionListener() {
         public void valueChanged(ListSelectionEvent e) {
            String selectedString = list.getSelectedValue().toString();
            fileChooser.setSelectedFile(new File(selectedString));
         }
      });

      add(labelPanel, BorderLayout.PAGE_START);
      add(new JScrollPane(list), BorderLayout.CENTER);
   }

   public static void main(String[] args) {
      JFileChooser fileChooser = new JFileChooser();
      Chooser c = new Chooser(fileChooser);
      fileChooser.setAccessory(c);
      fileChooser.showOpenDialog(null);
   }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X