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(); } }
3 Réponses :
c'est la mise en page que vous utilisez dans Dans votre cas, je voudrais utiliser une gridlayout avec une colonne, des rangées infinies: p> 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.)
scrollPane.setSize(300, 525);
scrollPane.getVerticalScrollBar();
Lot de problèmes de mise en page ici
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()); } }
Qu'est-ce que Viewport?
@Lep: Chaque JScrollPane a une fenêtre de vision comme premier et principal composant. Le composant affiché i> dans le jscrollpane est détenu dans la fenêtre comme sa "vue". Ceci est bien expliqué avec des images i> dans le Jscrollpane Tutoriel . Donnez à ce lien un look.
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(); } }