如何在JFrame关闭后读取下一行GUI(Java)

时间:2014-04-15 19:48:11

标签: java eclipse swing user-interface jframe

基本上我使用Eclipse制作一个Java音乐播放器,我在主GUI上有一个叫做“添加歌曲”的JButton - 用户点击它并出现另一个JFrame,允许用户点击“浏览”并选择来自计算机的mp3文件。然后我将数据存储为我创建的musicFile对象,并且我想将此信息发送回main函数。我的“添加歌曲”动作监听器的代码如下:

private ActionListener song(final JButton button)
{
    return new ActionListener(){
        public void actionPerformed(ActionEvent event)
        {
            addSongGUI addSong = new addSongGUI(); //the JFrame that opens

//once the user presses the "add song" button

            listOfSongs.add(addSong.musicFile); //the addSongGUI has a musicFile variable that I want to read and get information from

            String songName = addSong.musicFile.getSongName();
                            //... and do more stuff 


        }
    };
}

当它运行时,“String songName = addSong.musicFile.getSongName();”给我一个空指针异常,因为它试图在用户可以选择一首歌来设置musicFile之前立即从addSongGUI读取musicFile。那么,我怎么能等到用户选择一首歌,关闭窗口,然后读取这行代码(我该怎么做才能摆脱这个空指针异常)?谢谢。

1 个答案:

答案 0 :(得分:0)

如上所述,当您需要模态对话框时,正确且简单的解决方案不是显示JFrame - 而是使用模态JDialog:

private ActionListener song(final JButton button) {
    return new ActionListener(){
        public void actionPerformed(ActionEvent event)  {

            // AddSongDialog is a modal JDialog
            AddSongDialog addSong = new AddSongDialog(mainJFrame); 
            addSong.setVisible(true); // show it -- this pauses flow of code here
            String songName = addSong.musicFile.getSongName();
                            //... and do more stuff 
        }
    };
}

同样,addSongDialog是一个模态JDialog,这就是你需要将应用程序的主JFrame传入其中的原因,因为在调用JDailog时需要JFrame(或父JDialog)。构造函数中的超级构造函数。

另一个更弱的解决方案是使用JFrame并向其添加一个WindowListener,但为什么在JDialog解决方案如此简单易用的情况下呢?