0
votes

Barre de défilement verticale pour boutons radio

Je suis un très nouveau programmeur Java.

J'essaie de créer une liste verticale de boutons radio avec une barre de défilement. Mon code ne produit pas la fenêtre à la taille désignée, ni la barre de défilement n'apparaît réellement. P>

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;

public class RadioButtonScroller {
    private List<String> abcList = new ArrayList<>(Arrays.asList("Aa", "Bb", "Cc", "Dd", "Ee", "Ff", "Gg", "Hh", "Ii",
            "Jj", "Kk", "Ll", "Mm", "Nn", "Oo", "Pp", "Qq", "Rr", "Ss", "Tt", "Uu", "Vv", "Ww", "Xx", "Yy", "Zz"));
    private JRadioButton pickButton;
    private JFrame jframe = new JFrame("Select one:");
    private JScrollPane scrollPane;
    private JPanel panel = new JPanel();
    private Box vertBox;

    public RadioButtonScroller() {
        createUI();
    }

    public void setRadioButtons() {
        ButtonGroup group = new ButtonGroup();

        for (int i = 0; i < abcList.size(); i++) {
            String theseLetters = abcList.get(i);
            pickButton = new JRadioButton(theseLetters);

            group.add(pickButton);
            vertBox.add(pickButton);
        }
    }

    private void createUI() {
        //centers on screen
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        jframe.setLocationRelativeTo(null);
        jframe.setLocation(dim.width / 3 - jframe.getSize().width / 3, dim.height / 4 - jframe.getSize().height / 4);

        vertBox = Box.createVerticalBox();
        jframe.setSize(300, 525);
        vertBox.setSize(300, 525);
        jframe.setVisible(true);

        panel.setLayout(new FlowLayout());
        jframe.add(panel);
        scrollPane = new JScrollPane(vertBox);
        scrollPane.setSize(300, 525);
        scrollPane.getVerticalScrollBar();
        panel.add(scrollPane);

        jframe.pack();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setRadioButtons();
    }

    public static void main(String[] args) {
        RadioButtonScroller radioButtonScroller = new RadioButtonScroller();
    }
}


0 commentaires

3 Réponses :


1
votes

c'est la mise en page que vous utilisez dans panneau.setlayout (New FlowLayout ()); code>. La disposition de flux "ne fonctionne pas bien" avec jscrollpane code>. Vous pouvez modifier la mise en page et vous obtiendrez un volet de défilement fonctionnel sans avoir à faire des choses supplémentaires. (Afin de faire des travaux de mise en page de flux avec un JScrollpane, vous devrez étudier davantage, probablement avec des composantsListenants, etc.)

Dans votre cas, je voudrais utiliser une gridlayout avec une colonne, des rangées infinies: p>

scrollPane.setSize(300, 525);
scrollPane.getVerticalScrollBar();


0 commentaires

1
votes

Lot de problèmes de mise en page ici

  1. Les gestionnaires de layout, pour la plupart, ne respectent pas la taille d'un composant, mais plutôt sa taille préférée. Li>
  2. et la taille de JScrollPane est contrôlée par la taille préférée de sa fenêtre. li>
  3. Flowlayout est très basique et impitoyable et ne fonctionnera souvent pas bien avec des dispositions combinées complexes. LI>
  4. Ne pas ajouter de composants après em> emballer votre jframe mais auparavant auparavant. Sinon les composants et les gestionnaires de mise en page ne se forment pas en conséquence. Li> ol>

    E.g., P>

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class RadioButtonScroller2 extends JPanel {
        private List<String> abcList = new ArrayList<>(Arrays.asList("Aa", "Bb", "Cc", "Dd", "Ee", "Ff", "Gg", "Hh", "Ii",
                "Jj", "Kk", "Ll", "Mm", "Nn", "Oo", "Pp", "Qq", "Rr", "Ss", "Tt", "Uu", "Vv", "Ww", "Xx", "Yy", "Zz"));
        private ButtonGroup buttonGroup = new ButtonGroup();
    
        public RadioButtonScroller2() {
            JPanel radioPanel = new JPanel(new GridLayout(0, 1));
            ItemListener il = itemEvent -> {
                if (itemEvent.getStateChange() == ItemEvent.SELECTED) {
                    AbstractButton btn = (AbstractButton) itemEvent.getSource();
                    System.out.println("Selection: " + btn.getActionCommand());
                }
            };
            for (String radioText : abcList) {
                JRadioButton radioButton = new JRadioButton(radioText);
                radioButton.setActionCommand(radioText);
                radioButton.addItemListener(il);
                radioPanel.add(radioButton);
                buttonGroup.add(radioButton);
            }
    
            JScrollPane scrollPane = new JScrollPane(radioPanel);
            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            scrollPane.getViewport().setPreferredSize(new Dimension(150, 200));
    
            setLayout(new BorderLayout());
            add(scrollPane);
        }
    
        private static void createAndShowGui() {
            RadioButtonScroller2 mainPanel = new RadioButtonScroller2();
    
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    }
    


2 commentaires

Qu'est-ce que Viewport?


@Lep: Chaque JScrollPane a une fenêtre de vision comme premier et principal composant. Le composant affiché dans le jscrollpane est détenu dans la fenêtre comme sa "vue". Ceci est bien expliqué avec des images dans le Jscrollpane Tutoriel . Donnez à ce lien un look.



0
votes

Les deux réponses m'ont conduit à ma réponse, merci à tous les deux! Merci beaucoup à George Z. et aéroglisseur plein d'anguilles pour souligner que:

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;

public class RadioButtonScroller {
    private List<String> abcList = new ArrayList<>(Arrays.asList("Aa", "Bb", "Cc", "Dd", "Ee", "Ff", "Gg", "Hh", "Ii",
            "Jj", "Kk", "Ll", "Mm", "Nn", "Oo", "Pp", "Qq", "Rr", "Ss", "Tt", "Uu", "Vv", "Ww", "Xx", "Yy", "Zz"));
    private JRadioButton pickButton;
    private JFrame jframe = new JFrame("Select one:");
    private JScrollPane scrollPane;
    private JPanel panel = new JPanel();
    private Box vertBox;

    public RadioButtonScroller() {
        createUI();
    }

    public void setRadioButtons() {
        ButtonGroup group = new ButtonGroup();

        for (int i = 0; i < abcList.size(); i++) {
            String theseLetters = abcList.get(i);
            pickButton = new JRadioButton(theseLetters);

            group.add(pickButton);
            vertBox.add(pickButton);
        }
        jframe.pack();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void createUI() {
        // center on screen
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        jframe.setLocationRelativeTo(null);
        jframe.setLocation(dim.width / 3 - jframe.getSize().width / 3, dim.height / 4 - jframe.getSize().height / 4);

        vertBox = Box.createVerticalBox();
        jframe.setSize(300, 525);
        vertBox.setSize(300, 525);
        jframe.setVisible(true);

        panel.setLayout(new GridLayout(0, 1));
        jframe.add(panel);
        scrollPane = new JScrollPane(vertBox);
        scrollPane.setPreferredSize(new Dimension(300, 525));
        panel.add(scrollPane);

        setRadioButtons();
    }

    public static void main(String[] args) {
        RadioButtonScroller radioButtonScroller = new RadioButtonScroller();
    }
}


0 commentaires