将Jlist添加到Jpanel



我正在尝试将jlist添加到jpanel。具体来说,我有两个jpanels,一个右一个和一个左一个。正确的一个有两个按钮。在左侧,我想要jlist myspriteoptions(请参见下面的代码)。不幸的是,当我运行代码时,这个Jlist从未出现。我不是摇摆专家(实际上我是一个庞大的新手),所以我不知道为什么这是。

这是我的代码:

    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);
    }
}

JPanel的默认布局为 FlowLayout

FlowLayout喜欢使用其组件的首选大小来布局。

默认尺寸为空的JList可能是0x0,这意味着它永远不会显示。

尝试使用BorderLayoutmyRight = new JPanel(new BorderLayout());)创建正确的面板,然后将JList添加到它,包裹在JScrollPane ...

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

看看

  • 使用布局经理
  • 布局经理的视觉指南

有关更多信息

您永远不会将myScrollPane添加到JPanel myLeft

myLeft.add(myScrollPane);

尽管您已将mySpriteOptions添加到myLeft中,但也将其设置为myScrollPaneViewportView

一个组件只能在其已连接到的最后一个容器上绘制—因此,仅出现在JScrollPane中,但尚未添加。

现在,不需要此语句:

myLeft.add(mySpriteOptions);

最新更新