0
votes

panneau ne veut pas faire défiler

J'ai ce morceau de code (un panneau contenant d'autres jComponent code> S, dans ce cas jbutton code> s) et un problème.

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.util.*;

public class JTagPanelTest extends JPanel{

    public JTagPanelTest(){
        setLayout(new FlowLayout(FlowLayout.LEADING, 2, 0));
    }

    public void initializeTags(List<String> tags){
        tags.forEach(tag -> add(new JButton(tag)));
    }

    public static void main(String[] args){
        EventQueue.invokeLater(() -> {
            try{
                String lookAndFeelName = UIManager.getSystemLookAndFeelClassName();
                UIManager.setLookAndFeel(lookAndFeelName);
            }
            catch(Exception e){
                e.printStackTrace();
            }

            JTagPanelTest test = new JTagPanelTest();
            test.initializeTags(Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
                "012", "qwer", "z<xc", "rty", "poiu", "gfj", "zxcv", "mjnb", "mko", "nij", "bhu"));
            JScrollPane scrollPane = new JScrollPane(test);
            scrollPane.setHorizontalScrollBar(null);
            test.setPreferredSize(new Dimension(200, 100));
//          scrollPane.setPreferredSize(new Dimension(200, 180));
            JFrame frame = new JFrame("Test");
            frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(new Dimension(200, 180));
            frame.setLocationRelativeTo(null);
            frame.setResizable(false);
            frame.setVisible(true);
        });
    }

}


3 commentaires

Remarque Tous les composants Swing doivent être créés sur le thread d'expédition de l'événement (EDT). Donc, tout le code, pas seulement l'éviscile (...) devrait faire partie du invoquater (...)


Ce test.setpreferredsize (nouvelle dimension (200, 100)); contraint artificiellement la taille du test JPanel. Vous faites très certainement pas veux faire cela.


Si je supprime cette ligne, les boutons ne s'enveloppent pas au bord du panneau


3 Réponses :


2
votes

Vous avez essayé la bonne approche en définissant la taille préférée sur Scrollpane .

donc revenir à ce changement. La raison pour laquelle il ne fait pas défiler n'est pas parce que votre contenu n'est pas ajouté pour aligner verticalement. Définir une mise en page L'aide a ajouté des éléments verticalement.

par exemple: xxx


1 commentaires

je vous remercie beaucoup!! ... Mais de cette manière, tous les boutons apparaissent dans la colonne ... Y a-t-il un moyen d'avoir une liste de boutons qui enveloppe au bord droit du panneau et s'étend éventuellement verticalement?



0
votes

J'ai aussi trouvé Ce code qui résout le problème des composants empilés verticaux. Et Celui-ci .


0 commentaires

0
votes

Je comprends que vous souhaitez que les boutons enveloppent, vous les ajoutez d'où vous les ajoutez à un jPanel code> qui utilise le gestionnaire de présentation code> flowlayout code>. Je comprends aussi que vous souhaitez que le jPanel code> contenant ces boutons à faire défiler. J'ai obtenu cela en définissant les tailles préférées du JScrollpane code> et le jPanel code> contenant les boutons, comme indiqué dans le code ci-dessous.

import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Arrays;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;

public class BtnScrl implements Runnable {
    public void run() {
        showGui();
    }

    private void showGui() {
        JFrame frame = new JFrame("BtnScrl");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createButtons());
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JScrollPane createButtons() {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(400, 290));
        for (String tag : Arrays.asList("one",
                                        "two",
                                        "three",
                                        "four",
                                        "five",
                                        "six",
                                        "seven",
                                        "eight",
                                        "nine",
                                        "ten",
                                        "012",
                                        "qwer",
                                        "z<xc",
                                        "rty",
                                        "poiu",
                                        "gfj",
                                        "zxcv",
                                        "mjnb",
                                        "mko",
                                        "nij",
                                        "bhu")) {
            panel.add(new JButton(tag));
        }
        JScrollPane scrollPane = new JScrollPane(panel);
        scrollPane.setPreferredSize(new Dimension(400, 100));
        return scrollPane;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new BtnScrl());
    }
}


2 commentaires

Après quelques essais avec votre code, je suis arrivé à la conclusion que le Scrollpane défile car vous avez ajouté la ligne panneau.SetpreferredSize (nouvelle dimension (400, 290)); , et je ne connais pas la hauteur du panneau global préalable.


@MAUROREV Vous pouvez calculer la taille préférée en fonction des tailles des boutons. Ou vous pouvez définir une taille arbitraire qui est ce que jtalle fait. Ce ne sont pas les seules options disponibles. S'il y a des détails que vous souhaitez ajouter à votre question, vous pouvez. Tout ce que vous avez à faire est Modifier Votre question. Notez que j'ai écrit dans ma réponse que j'ai défini les tailles préférées des deux jPanel et le jscrollpane .