【问题标题】:How to launch a second JFrame from clicking a JButton?如何通过单击 JButton 启动第二个 JFrame?
【发布时间】:2015-05-02 01:46:21
【问题描述】:

我正在制作一个待办事项列表应用程序,我有一个 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 中的一个项目,然后选择前进箭头按钮时,我什么也得不到。但是当我单击列表中的另一个元素并再次按下前进箭头按钮时,我的 SubList 会弹出两次。

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

【问题讨论】:

    标签: java swing jbutton actionlistener


    【解决方案1】:

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

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

    请注意,我根本不会使用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
        }
    }
    

    作为附带推荐,请查看The Use of Multiple JFrames, Good/Bad Practice?

    【讨论】:

    • 我会在我的初始化方法中添加什么?
    • @PhilDrach:很难说,因为您只发布了一小段代码。最好发布一个非常小的可编译程序来重现您的问题。但底线是您只需要一次添加您的听众。
    • @PhilDrach:还要注意我根本不会使用 ListSelectionListener。相反,我只在按钮上使用一个 ActionListener。然后在那个监听器中,获取列表的选择并使用它。
    • @PhilDrach:例如
    • 最后一个问题,在您的示例代码中'// 在此处对选择进行操作',我如何发送选择以通过按钮注册?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多