Okay, got this working. That thing about needing 1 of each swing element for each panel is one of those things that seems super obvious in hindsight. Here's what I ended up with:
//Method makes the control panel frame.
private void makeControlFrame()
{
//Primary frame.
JFrame controlPanel = new JFrame("CONTROL PANEL");
//Five control panels each to hold controls for one fan or star.
JPanel componentControlPanel[] = new JPanel[5];
//Labels for control panel elements.
String[] labels = {"North Fan" , "East Fan", "South Fan", "West Fan", "Center Star"};
controlPanel.setLayout(new GridLayout(5,1));
controlPanel.addWindowListener(new FrameListener());
//Add elements to sub panels, then add to the control panel frame.
for(int i = 0; i < 5; i++)
{
//Create the basic border.
Border subPanelBorder = BorderFactory.createLineBorder(Color.BLACK);
//Modify it to add the name of the current element.
subPanelBorder = BorderFactory.createTitledBorder(subPanelBorder, labels[i]);
//Create GUI elements for this sub panel.
componentControlPanel[i] = new JPanel();
//componentControlPanel[i].add(new JLabel(labels[i] +" Direction"));
grpDirection[i] = new ButtonGroup();
jslSpeed[i] = new JSlider(JSlider.HORIZONTAL,1,1000,100);
jrbClockWise[i] = new JRadioButton("Clockwise");
jrbCounterClockWise[i] = new JRadioButton("Counterclockwise");
//Set attributes of speed slider bar.
jslSpeed[i].setMinorTickSpacing(100);
jslSpeed[i].setPaintTicks(true);
jslSpeed[i].setPaintLabels(true);
//Group radio buttons.
grpDirection[i].add(jrbClockWise[i]);
grpDirection[i].add(jrbCounterClockWise[i]);
//Set layout manager for the sub panel.
componentControlPanel[i].setLayout(new FlowLayout(FlowLayout.LEFT));
//Another sub panel to group the radio buttons.
JPanel radioSubPanel = new JPanel();
radioSubPanel.setLayout(new GridLayout(3,1));
radioSubPanel.add(new JLabel("Direction"));
radioSubPanel.add(jrbClockWise[i]);
radioSubPanel.add(jrbCounterClockWise[i]);
//Another sub panel to group the speed slider and label.
JPanel sliderSubPanel = new JPanel();
sliderSubPanel.setLayout(new GridLayout(3,1));
sliderSubPanel.add(new JLabel("Speed"));
sliderSubPanel.add(new JLabel("FAST ------------------------------- SLOW"));
sliderSubPanel.add(jslSpeed[i]);
//Add radio and slider sub panels to control panel.
componentControlPanel[i].add(sliderSubPanel);
componentControlPanel[i].add(radioSubPanel);
//Register listeners.
jslSpeed[i].addChangeListener(new HandleSliders(i));
jrbClockWise[i].addActionListener(new HandleRadioButtons(i));
jrbCounterClockWise[i].addActionListener(new HandleRadioButtons(i));
//Set the title border for the control panel.
componentControlPanel[i].setBorder(subPanelBorder);
//Add this panel to the main frame.
controlPanel.add(componentControlPanel[i]);
}
//Speed slider bar for the star has different minimum and maximum values.
jslSpeed[4].setValue(500);
jslSpeed[4].setMinimum(100);
jslSpeed[4].setMaximum(2000);
jslSpeed[4].setMinorTickSpacing(200);
//Set attributes of frame.
controlPanel.setVisible(true);
controlPanel.setResizable(false);
controlPanel.pack();
}