javaswinguser-interfacejscrollpanejlayeredpane

Is there a way to insert multiple JScrollPanes into a JLayeredPane?


In short, I´m trying to make a program that mocks a streaming service interface for an assignment. The program creates two separate JScrollPanes with same specs (size, constraints..), one for movies and one for series, each containing a JPanel which then contains other movie or series components. Then, I created a JLayeredPane (without changing its layout), in which I want to add the two JScrollPanes as separate layers. However, when adding the JScrollPanes to the JLayeredPane and running the code, the JLayeredPane always shows the last added JScrollPane, regardless of the index I set upon adding.

        //creates the movie JScrollPane
        JScrollPane moviePanel = stuff.showMovies(movieLogic);

        //creates the series JScrollPane
        JScrollPane seriesPanel = stuff.showSeries(seriesLogic);

        //creates a JLayeredPane in which I want to insert the JScrollPanes as layers
        layerPanel = new JLayeredPane();
       

        //adds the moviePanel to index 3 and seriesPanel to index 5 in the JLayeredPane
        //I´m assuming index 3 is not as deep as index 5, meaning moviePanel should be in the front,
        //but I have also tried switching indexes just in case
        layerPanel.add(moviePanel, 3);
        layerPanel.add(seriesPanel, 5);
        
        //another attempt at getting the moviePanel to the front of the JLayeredPane, but
        //seriesPanel still shows up on top
        layerPanel.moveToFront(moviePanel); 

What am I missing or doing wrong?


Solution

  • Again, the simplest solution might be to use a JList and swap models. For example the following uses two models, one that displays color Strings the other days of the week, and the models are swapped in a button's action listener:

    import java.awt.BorderLayout;    
    import javax.swing.*;
    
    public class SwapStuff extends JPanel {
        public static final String[] DAYS_OF_WEEK = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
                "Saturday" };
        public static final String[] COLORS = { "Red", "Orange", "Yellow", "Green", "Blue", "Violet" };
        private DefaultListModel<String> dayModel = new DefaultListModel<>();
        private DefaultListModel<String> colorModel = new DefaultListModel<>();
        private JList<String> list = new JList<>(dayModel);
        private JTextField displayField = new JTextField(20);
    
        public SwapStuff() {
            for (String element : DAYS_OF_WEEK) {
                dayModel.addElement(element);
            }
            for (String element : COLORS) {
                colorModel.addElement(element);
            }
            list.setVisibleRowCount(5);
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            JScrollPane scrollPane = new JScrollPane(list);
    
            displayField.setFocusable(false);
    
            JButton weekdayBtn = new JButton("Weekdays");
            JButton colorBtn = new JButton("Colors");
    
            weekdayBtn.addActionListener(e -> {
                if (dayModel != list.getModel()) {
                    list.setModel(dayModel);
                }
            });
            colorBtn.addActionListener(e -> {
                if (colorModel != list.getModel()) {
                    list.setModel(colorModel);
                }
            });
            list.addListSelectionListener(e -> {
                String selection = list.getSelectedValue();
                displayField.setText(selection);
            });
    
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(weekdayBtn);
            buttonPanel.add(colorBtn);
    
            setLayout(new BorderLayout());
            add(displayField, BorderLayout.PAGE_START);
            add(scrollPane);
            add(buttonPanel, BorderLayout.PAGE_END);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    
        private static void createAndShowGui() {
            SwapStuff mainPanel = new SwapStuff();
            JFrame frame = new JFrame("SwapStuff");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.add(mainPanel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    }