I'm a very new java programmer.
I'm trying to create a vertical list of radio buttons with a scroll bar. My code doesn't produce the window at the designated size, nor does the scroll bar actually appear.
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();
}
}
I've successfully used JFrame with Vbox before, but the addition of JPanel & JScrollPane is getting me all mixed up.
(I cannot use JavaFX, due to some compatibility issues. Must be in swing.)
Many thanks.
Its the layout you are using in
panel.setLayout(new FlowLayout());
. Flow layout "does not work well" withJScrollPane
. You can change the layout and you will get a functional scroll pane without having to do extra stuff. (In order to make flow layout work with a JScrollPane, you will have to investigate further, probably with componentlisteners etc)In your case I would use a GridLayout with 1 column, infinite rows:
Or a BoxLayout with y axis:
Also, these lines play no role:
Scrollpane's size will be calculated from parent container, which is JFrame's content pane.