簡體   English   中英

將JList添加到JPanel

[英]Adding JList to JPanel

我正在嘗試將JList添加到JPanel。 具體來說,我有兩個JPanel,一個為右,一個為左。 右側有兩個按鈕。 在左側,我想要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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM