2009-04-27 62 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()方法。