Java 如何通过单击JButton启动第二个JFrame?

Java 如何通过单击JButton启动第二个JFrame?,java,swing,jbutton,actionlistener,Java,Swing,Jbutton,Actionlistener,我正在做一个待办事项列表应用程序,我有一个主列表框架和一个子列表框架。当用户从PrimaryList菜单中选择某个内容…或类似的内容,然后点击向前箭头按钮时,应该启动子列表框架。下面是我对前进箭头按钮的actionPerformed方法的介绍,该按钮名为BT狭窄 private void btnArrowActionPerformed(java.awt.event.ActionEvent evt) { ls

我正在做一个待办事项列表应用程序,我有一个主列表框架和一个子列表框架。当用户从PrimaryList菜单中选择某个内容…或类似的内容,然后点击向前箭头按钮时,应该启动子列表框架。下面是我对前进箭头按钮的actionPerformed方法的介绍,该按钮名为BT狭窄

private void btnArrowActionPerformed(java.awt.event.ActionEvent evt) {                                         
    lstToDoLists.addListSelectionListener(new ListSelectionListener(){
        public void valueChanged(ListSelectionEvent e){
            if (lstToDoLists.getSelectedIndex() > 0){
                btnArrow.addActionListener(new ActionListener(){
                    public void actionPerformed (ActionEvent ae){
                        if (btnArrow==ae.getSource()){
                            SubList sublist = new SubList();
                            sublist.setVisible(true);
                        }
                    }
                });
            }
        }            
    });
}
现在,当我运行PrimaryList文件并单击JList中的一个项目,然后选择前进箭头按钮时,我什么也得不到。但是,当我从列表中单击另一个元素并再次按下前进箭头按钮时,我的子列表会弹出两次


我写的东西有点不对劲,我希望其他人知道如何解决这个问题。

您正在侦听器中添加侦听器-这是您不想做的事情,因为这意味着每次事件发生时都会添加新的侦听器

解决方案:不要在其他事件侦听器中添加侦听器,而是在代码的构造函数或初始化方法中一次性添加侦听器

请注意,我根本不会使用ListSelectionListener。相反,我只在按钮上使用一个ActionListener。然后在该侦听器中,获取列表的选择并使用它

e、 g


作为附带建议,请查看。

您正在侦听器中添加侦听器-这是您不想做的事情,因为这意味着每次事件发生时都会添加新的侦听器

解决方案:不要在其他事件侦听器中添加侦听器,而是在代码的构造函数或初始化方法中一次性添加侦听器

请注意,我根本不会使用ListSelectionListener。相反,我只在按钮上使用一个ActionListener。然后在该侦听器中,获取列表的选择并使用它

e、 g


作为附带建议,请看。

那么我在初始化方法中会放些什么?@PhilDrach:很难说,因为您只发布了一小段代码。最好发布一个非常小的可编译程序来重现您的问题。但最重要的是,您应该注意只添加一次侦听器。@PhilDrach:还要注意,我根本不会使用ListSelectionListener。相反,我只在按钮上使用一个ActionListener。然后在该侦听器中,获取列表的选择并使用它。@PhilDrach:例如,最后一个问题,在您的示例代码中,您有“//在这里对选择做些什么”,我如何通过按钮发送要注册的选择?然后我会在我的初始化方法中放置什么?@PhilDrach:很难说,因为你只发布了一小段代码。最好发布一个非常小的可编译程序来重现您的问题。但最重要的是,您应该注意只添加一次侦听器。@PhilDrach:还要注意,我根本不会使用ListSelectionListener。相反,我只在按钮上使用一个ActionListener。然后在该侦听器中,获取列表的选择并使用它。@PhilDrach:例如,最后一个问题,在您的示例代码中,您有“//在此处处理选择”,我如何发送选择以通过按钮注册?
private void btnArrowActionPerformed(java.awt.event.ActionEvent evt) {  
    // if list contains String:
    String selectedItem = (String) lstToDoLists.getSelectedItem();

    // check that selectedItem isn't null, i.e, 
    if (selectedItem != null) {
        // TODO: do something with selection here
    }
}