2009-04-27 57 views
0

嘿堆棧溢出鄉親的Java GUI組件,增加對鼠標事件

我一直在試圖獲取代碼的工作,我可以雙擊某個項目在JList和它在不同的地方創建一個新的JList從頭開始構建屬於該類別的所有項目的對象名稱(我猜這是無用的信息)。 但問題是,當我雙擊列表中的項目時,它會通過代碼運行以將組件添加到JFrame,但它永遠不會顯示,這是因爲我使用鼠標事件在運行時間後構建它或者其他的東西?

我的GUI類是:

public class MediaGUI extends JFrame 

和添加代碼在這裏發生

_mediaList.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent event) { 
      if (event.getClickCount() == 2) { 
       CreateObjectPane(_mediaList.getSelectedValue().toString();); 
      } 
     } 
    }); 

這裏是建築物代碼,這種方法屬於MediaGUI,所以這一點。指的是一個JFrame

private void CreateObjectPane(String category) 
{ 
    /*======================================================================= 
    * Create ther list on Objects that belong to each category 
    * Also a scroll bar for the list 
    *=======================================================================*/ 
    String objects[] = _mediaHandler.GetObjects(category); 
    _mediaList = new JList(objects); 
    _mediaList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
    _mediaList.setLayoutOrientation(_mediaList.VERTICAL); 
    _mediaList.setVisibleRowCount(-1); 

    _mediaScrollPane = new JScrollPane(_mediaList); 
    _mediaScrollPane.setPreferredSize(new Dimension(100,100)); 
    _mediaScrollPane.setAlignmentX(CENTER_ALIGNMENT); 

    _mediaPanel = new JPanel(); 
    _mediaPanel.setLayout(new BoxLayout(_mediaPanel, BoxLayout.PAGE_AXIS)); 
    _mediaLabel = new JLabel("Media Objects"); 
    _mediaLabel.setLabelFor(_mediaList); 

    _mediaPanel.add(_mediaLabel); 
    _mediaPanel.add(Box.createRigidArea(new Dimension(0, 15))); 
    _mediaPanel.add(_mediaScrollPane); 
    _mediaPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 

    this.add(_mediaPanel, BorderLayout.CENTER); 
} 

你可以提供任何幫助將是巨大的,如果需要更多的解釋,我很高興地要求它

+0

你確定問題出在鼠標處理程序上嗎?不與GUI本身?也許你需要調用repaint()或其他東西? – Aziz 2009-04-27 04:55:35

回答

3

documentation

Note: If a component has been added to a container that has been displayed, 
validate must be called on that container to display the new component. 
If multiple components are being added, you can improve efficiency by 
calling validate only once, after all the components have been added. 

其他一些提示:

  • 將CreateObjectPane重命名爲createObjectPane
  • 您使用的是什麼LayoutManager?試着嘗試一下,因爲大多數時候新組件不會出現在你期望的位置。
+0

非常感謝,我認爲我需要閱讀更多內容。 – Craig 2009-04-27 07:37:03

0

我需要在新創建的組件的容器上調用revalidate()方法。