繁体   English   中英

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

[英]How to launch a second JFrame from clicking a JButton?

我正在制作待办事项列表应用程序,并且有一个PrimaryList框架和一个SubList框架。 当用户从PrimaryList(杂货店……)中选择某项然后单击前进箭头JButton时,它应该启动SubList框架。 现在,这里是用于btnArrow的向前箭头按钮的actionPerformed方法的内容。

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。 然后在该侦听器中,获取列表的选择并使用它。

例如,

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

作为附带建议,请查看“使用多个JFrame,良好/不良做法?”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM