Maison  >  Article  >  Java  >  Comment ajuster dynamiquement la taille d'un JDialog avec une limite de hauteur maximale ?

Comment ajuster dynamiquement la taille d'un JDialog avec une limite de hauteur maximale ?

DDD
DDDoriginal
2024-10-24 03:35:30511parcourir

How to Dynamically Adjust the Size of a JDialog with a Maximum Height Limit?

Comment définir la taille maximale d'un JDialog

Problème :

Dans un JDialog avec un BorderLayout contenant un volet de défilement et des boutons de contrôle en dessous, le comportement requis est que la boîte de dialogue ajuste dynamiquement sa taille pour s'adapter au contenu du volet de défilement jusqu'à ce qu'une taille maximale spécifiée soit atteinte. Cependant, définir la taille maximale à l'aide de setMaximumSize() semble n'avoir aucun effet.

Réponse :

Alors que la méthode setMaximumSize() devrait en effet limiter la taille maximale du Il se peut qu'elle ne fonctionne pas comme prévu en raison de l'interaction entre le BorderLayout, le volet de défilement et les paramètres de taille préférée.

Pour résoudre ce problème, envisagez d'utiliser l'approche suivante :

  1. Fournir des informations utiles : Déterminez si l'un des composants du volet de défilement peut fournir des informations pour définir la taille préférée de la fenêtre d'affichage.
    Par exemple, JList dispose d'une méthode pratique setVisibleRowCount() qui peut aider à définir la taille préférée de la fenêtre.
  2. Ajuster dynamiquement la taille de la fenêtre : Définissez la taille préférée de la fenêtre en fonction des informations obtenues à partir du composant à l'étape 1. Pour JList, list.setVisibleRowCount( count) peut être utilisé pour ajuster la hauteur de la fenêtre à mesure que des éléments sont ajoutés.
  3. Revalider et reconditionner la boîte de dialogue : Après avoir modifié la taille de la fenêtre, revalidez et reconditionnez la boîte de dialogue pour appliquer les modifications . dlg.revalidate(); dlg.pack(); garantira que la boîte de dialogue s'adapte à la nouvelle taille préférée.

Exemple :

Pour démontrer cette approche, considérons le JDialog suivant avec une JList qui ajoute dynamiquement articles. La boîte de dialogue s'agrandit jusqu'à atteindre une hauteur maximale, après quoi des barres de défilement apparaissent.

<code class="java">import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ListDialog {

    // Initial number of items and maximum height
    private static final int INITIAL_COUNT = 5;
    private static final int MAX_HEIGHT = 200;

    private JDialog dlg = new JDialog();
    private DefaultListModel model = new DefaultListModel();
    private JList list = new JList(model);
    private JScrollPane sp = new JScrollPane(list);
    private int count = INITIAL_COUNT;

    public ListDialog() {
        JPanel panel = new JPanel();
        panel.add(new JButton(new AbstractAction("Add") {

            @Override
            public void actionPerformed(ActionEvent e) {
                append();
                sp.revalidate();
                dlg.pack();

                // Check if maximum height exceeded
                if (dlg.getHeight() > MAX_HEIGHT) {
                    list.setVisibleRowCount(count);
                }
            }
        }));

        // Create initial items
        for (int i = 0; i < INITIAL_COUNT; i++) {
            this.append();
        }

        list.setVisibleRowCount(INITIAL_COUNT);
        dlg.add(sp, BorderLayout.CENTER);
        dlg.add(panel, BorderLayout.SOUTH);
        dlg.pack();
        dlg.setLocationRelativeTo(null);
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setVisible(true);
    }

    private void append() {
        model.addElement("String " + String.valueOf(++count));
        list.ensureIndexIsVisible(count - 1);
    }

    public static void main(String[] a_args) {
        new ListDialog();
    }
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn