Search code examples
javaswingjcomboboxjradiobutton

JComboBox within a JRadioButton


Say I wanted to add a JComboBox (or more general a JPanel, perhaps?) to a JRadioButton, what would be the easiest way to do it?

Pseudo-wise, a radio button group where one of them includes multiple choices would look something like:

O The weather
O Parties
O {meta, pseudo}-science
O Animals

where the {} would be a dropdown list. The trick here is that if one clicks either the dropdown list or the label '-science' the radio button would be actived and showing the UI border and all of that fancy stuff.

Thanks :)


Solution

  • I hate giving answers like this, but in this case I feel it is best...

    This seems like a very non-standard UI component. It would be much better UX if you just did:

    O The weather
    O Parties
    O meta-science
    O pseudo-science
    O Animals
    

    Users will not be familiar with the type of component you are proposing, and it is very inconsistent with the other options in the list. I highly recommend using a more standard convention.


    Against my better judgement, I present you with ComboBoxRadioButton:
    It is not complete, nor do I suggest using it, but it looks like what you want.

    import java.awt.FlowLayout;
    
    import javax.swing.AbstractButton;
    import javax.swing.ButtonGroup;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JToggleButton;
    
    public class ComboBoxRadioButton extends JRadioButton {
    
        private JLabel beforeText, afterText;
        private JComboBox comboBox;
    
        public ComboBoxRadioButton(String beforeTxt, JComboBox comboBox, 
                                                 String afterText) {
            this.comboBox = comboBox;
            this.beforeText = new JLabel("    " + beforeTxt);
            this.afterText = new JLabel(afterText);
            comboBox.setSelectedIndex(0);
            setLayout(new FlowLayout());
            setModel(new JToggleButton.ToggleButtonModel());
            add(this.beforeText);
            add(this.comboBox);
            add(this.afterText);
        }
    
        public static void main(String[] args) {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel mainPane = new JPanel();
            ButtonGroup group = new ButtonGroup();
            AbstractButton b2 = new JRadioButton("Java Swing");
            AbstractButton b3 = new ComboBoxRadioButton(
                    "It's gonna be a", new JComboBox(new String[] { "good", "bad",
                    "rainy" }), "day!");
            AbstractButton b4 = new JRadioButton("After the combo");
            group.add(b2);
            group.add(b3);
            group.add(b4);
            mainPane.add(b2);
            mainPane.add(b3);
            mainPane.add(b4);
            f.add(mainPane);
            f.pack();
            f.setVisible(true);
        }
    }