2012-11-10 139 views
1

我试图添加一个JList到JPanel。具体来说,我有两个JPanel,一个是正确的,一个是左边的。正确的有两个按钮。在左边我想要JList mySpriteOptions(见下面的代码)。不幸的是,当我运行我的代码时,这个JList永远不会显示出来。我不是专家(实际上我是一个巨大的新手),所以我不明白为什么会这样。将JList添加到JPanel

这里是我的代码:

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

} 

回答

4

你从不添加myScrollPaneJPanelmyLeft

myLeft.add(myScrollPane); 

虽然你已经添加mySpriteOptionsmyLeft,它也被设置为myScrollPaneViewportView

的组件将永远只能在最后容器上涂上它已经连接 —所以将只出现JScrollPane,但是这并没有被添加。现在

,则不需要这样的说法:

myLeft.add(mySpriteOptions); 
+0

非常感谢!这工作。 – covertbob

+0

不客气@covertbob! – Reimeus

5

的默认布局为JPanelFlowLayout

FlowLayout喜欢使用它的组件的首选大小来布置它们。

默认大小空JList可能是0x0,这意味着它永远不会显示。

尝试用BorderLayoutmyRight = new JPanel(new BorderLayout());),并添加JList它,包裹在JScrollPane ...

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

创造合适的面板在

欲了解更多信息

+0

感谢MadProgrammer,我一定会看看这些链接。 – covertbob

+0

我使用OverlayLayout来处理滚动窗格中JPanel中的JList。 –