covertbob
covertbob

Reputation: 701

Adding JList to JPanel

I'm trying to add a JList to a JPanel. Specifically, I have two JPanels, a right one and a left one. The right one has two buttons. On the left one I want the JList mySpriteOptions (see code below). Unfortunately, when I run my code, this JList never shows up. I'm no swing expert (in fact I'm a huge newb) so I can't figure out why this is.

Here is my code:

    import java.awt.*;
    import java.swing.*


    public class SpriteEditorLauncher extends JFrame {

    private JLabel mySearchBoxLabel;
    private JList mySpriteOptions;
    private JPanel myLeft;
    private JPanel myRight;
    private JScrollPane myScrollPane;
    private JTextField mySearchBox;
    private JButton myNewEditLauncher;
    private JButton myEditLauncher;

    private static final long serialVersionUID = 1L;
    private static final String FONT_TYPE = "Times New Roman";
    private static final int FONT_SIZE = 12;
    private static final int FONT_STYLE = 1;
    private static final Font FONT = new Font(FONT_TYPE, FONT_STYLE, FONT_SIZE);
    private static final int NUMBER_OF_ROWS = 1;
    private static final int NUMBER_OF_COLUMNS = 2;
    private static final int FRAME_WIDTH = 600;
    private static final int FRAME_HEIGHT = 400;

    public SpriteEditorLauncher () {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        initializeComponents();
        createLayout();
    }

    private void initializeComponents () {
        myLeft = new JPanel();
        myRight = new JPanel();
        myNewEditLauncher = new JButton();
        myEditLauncher = new JButton();
        myScrollPane = new JScrollPane();
        mySpriteOptions = new JList();
        mySearchBox = new JTextField();
        mySearchBoxLabel = new JLabel();

    }

    private void setPanelBorder (JPanel toSetBorderFor) {
        toSetBorderFor.setBorder(BorderFactory
                .createTitledBorder(null, "Options", TitledBorder.DEFAULT_JUSTIFICATION,
                                    TitledBorder.DEFAULT_POSITION, FONT));
    }

    private void setButtonLabel (JButton button, Font font, String label) {
        button.setFont(font);
        button.setText(label);
    }

    private void setFrameLayout () {
        GridLayout myLayout = new GridLayout(NUMBER_OF_ROWS, NUMBER_OF_COLUMNS);
        setLayout (myLayout);
        setPreferredSize(new Dimension(FRAME_WIDTH, FRAME_HEIGHT));
        setResizable(false);
    }

    private void addPanelsToFrame () {
        add(myLeft);
        add(myRight);
    }

    private void addButtonsToPanel (JPanel panel) {
        panel.add(myNewEditLauncher);
        panel.add(myEditLauncher);
    }



    private void createLayout () {

        setFrameLayout();
        setPanelBorder(myRight);
        setButtonLabel(myNewEditLauncher, FONT, "New");
        setButtonLabel(myEditLauncher, FONT, "Edit");

        addPanelsToFrame();

        addButtonsToPanel(myRight);



        mySpriteOptions.setModel(new AbstractListModel() {

            private static final long serialVersionUID = 1L;
            String[] strings = { "Item 1", "Item 2"};

            public int getSize () {
                return strings.length;
            }

            public Object getElementAt (int i) {
                return strings[i];
            }
        });

        myLeft.add(mySpriteOptions);

        myScrollPane.setViewportView(mySpriteOptions);

        mySearchBox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed (ActionEvent arg0) {
                // TODO Auto-generated method stub

            }
        });

        mySearchBoxLabel.setFont(FONT);
        mySearchBoxLabel.setLabelFor(mySearchBox);
        mySearchBoxLabel.setText("Search:");

        pack();
        setVisible(true);
    }

}

Upvotes: 2

Views: 8159

Answers (2)

Reimeus
Reimeus

Reputation: 159774

You never add myScrollPane to the JPanel myLeft:

myLeft.add(myScrollPane);

Although you have added mySpriteOptions to myLeft, it is also set as the ViewportView of myScrollPane.

A component will only ever be painted on the last container to which it has been attached —so will only appear in the JScrollPane, but this has not been added.

Now, this statement is not needed:

myLeft.add(mySpriteOptions);

Upvotes: 4

MadProgrammer
MadProgrammer

Reputation: 347204

The default layout for a JPanel is FlowLayout.

FlowLayout likes to use the preferred size of it's components to layout them.

The default size a empty JList is probably 0x0, which means it never shows up.

Try creating the right panel with a BorderLayout (myRight = new JPanel(new BorderLayout());) and add the JList to it, wrapped in JScrollPane...

private void addPanelsToFrame () {
    add(myLeft);
    add(new JScrollPane(myRight));
}

Take a look at

For more information

Upvotes: 6

Related Questions