Java 如何从另一个JFrame更新并添加到JList?

Java 如何从另一个JFrame更新并添加到JList?,java,swing,jframe,Java,Swing,Jframe,我有两个JFrames AddSongFrame通过jTextFields接收用户输入,MusicLayerAndLibraryForm使用用户输入更新jList 但是,我在向jList添加元素时遇到了问题。排队 MusicPlayerAndLibraryForm mplf = new MusicPlayerAndLibraryForm(); 似乎JFrame没有更新jList。它清除jList,然后将songName添加到jList 当用户访问另一个JFrame时,如何以不清除jList的方

我有两个
JFrames

AddSongFrame
通过
jTextFields
接收用户输入,
MusicLayerAndLibraryForm
使用用户输入更新
jList

但是,我在向
jList
添加元素时遇到了问题。排队

MusicPlayerAndLibraryForm mplf = new MusicPlayerAndLibraryForm();
似乎
JFrame
没有更新
jList
。它清除
jList
,然后将
songName
添加到
jList

当用户访问另一个
JFrame
时,如何以不清除
jList
的方式访问
JFrame

public class AddSongFrame extends javax.swing.JFrame {

        ArrayList<Song> songs = new ArrayList<Song>();
        ArrayList<Song> songFileLibrary = new ArrayList<Song>();
        DefaultListModel dlm = new DefaultListModel();

        int currentIndex = 0;



        public AddSongFrame() {
            initComponents();
        }


        private void jButtonBrowseFilesActionPerformed(java.awt.event.ActionEvent evt) {                                                   
           JFileChooser fileBrowser = new JFileChooser();
           fileBrowser.showOpenDialog(null);
           File f = fileBrowser.getSelectedFile();
           String fileName = f.getAbsolutePath();
           jTextFieldFileName.setText(fileName);

        }                                                  

        private void jButtonAddSongActionPerformed(java.awt.event.ActionEvent evt) {                                               

            String fileName = jTextFieldFileName.getText();
            String songName = jTextFieldSongName.getText();
            String songGenre = jTextFieldSongGenre.getText();
            String songArtist = jTextFieldArtist.getText();

            Song song = new Song(songName, fileName, songGenre, songArtist);
            Song songFiles = new Song(fileName,songName, songGenre,songArtist);
            songs.add(song);
            songFileLibrary.add(songFiles);


            updatejListMusicLibrary();

        }                                              



        private void updatejListMusicLibrary()
        {

            MusicPlayerAndLibraryForm mplf = new MusicPlayerAndLibraryForm();
            MusicPlayerAndLibraryForm.getjListMusicLibrary().setModel(dlm);
            mplf.setDlmMain(dlm);
            this.setVisible(false);
            mplf.setVisible(true);
    }
公共类AddSongFrame扩展了javax.swing.JFrame{
ArrayList歌曲=新建ArrayList();
ArrayList songFileLibrary=新的ArrayList();
DefaultListModel dlm=新的DefaultListModel();
int currentIndex=0;
公共AddSongFrame(){
初始化组件();
}
私有void jButtonBrowseFilesActionPerformed(java.awt.event.ActionEvent evt){
JFileChooser fileBrowser=新的JFileChooser();
fileBrowser.showOpenDialog(空);
文件f=fileBrowser.getSelectedFile();
字符串文件名=f.getAbsolutePath();
jTextFieldFileName.setText(文件名);
}                                                  
私有void jbuttonadsongactionperformed(java.awt.event.ActionEvent evt){
String fileName=jTextFieldFileName.getText();
String songName=jTextFieldSongName.getText();
String songgree=jTextFieldSongGenre.getText();
String songArtist=jtextfieldArtister.getText();
歌曲=新歌(歌曲名称、文件名、歌曲类型、歌曲艺术家);
Song songFiles=新歌(文件名、歌曲名、歌曲类型、歌曲艺术家);
歌曲。添加(歌曲);
添加(歌曲文件);
UpdateListMusicLibrary();
}                                              
私有void updateListMusicLibrary()
{
MusicLayerAndLibraryForm mplf=新的MusicLayerAndLibraryForm();
MusicLayerAndLibraryForm.getjListMusicLibrary().setModel(dlm);
mplf.setDlmMain(dlm);
此.setVisible(false);
mplf.setVisible(true);
}

您可以将列表设置为静态,然后在JFrame类中创建一个方法,当按下JFrame中的按钮或任何其他东西时,该方法调用静态列表并将其添加到其中


希望这有帮助….

您的问题很可能出现在以下位置:

MusicPlayerAndLibraryForm mplf = new MusicPlayerAndLibraryForm();
每次单击
JButton
时都会调用它,每次都会创建
musicplayer和libraryform
的新实例

您只需创建此类的实例一次,然后使用该实例更新
JList
,但是此行:

MusicPlayerAndLibraryForm.getjListMusicLibrary()
告诉我
getjListMusicLibrary()
是一种
静态方法,显示了程序中的设计问题


但是,正如我在上面的评论中所说的,避免使用或来询问用户信息,然后使用它来更新
JFrame
JList
的单个实例。正如我所说,也要避免并在类中创建它的实例。

我不确定您的行为是什么,但a可能更好因为我们无法访问
Song
code,也无法访问
MusicLayerAndLibraryForm
。请通读,然后阅读一个好的问题,这样你的问题可以得到更多更好的答案。也可以阅读(普遍的共识是:这不好)。最好使用
Dialog
s或
CardLayout
来构建GUI,以使用
JPanel
s,而不是
JFrame
s。由于您没有更改
JFrame
的行为,因此,无需
扩展它。请查看在新建
JFrame
上删除列表的原因它在每次点击时都会创建一个新的
列表
,但是如果不能够重现问题,很难判断,因此MCVE可能会解决我们的许多疑问,并指出问题的根源,可能还有一些你可能遇到的小问题。静态不是一个答案-如果op创建更多的类实例,它们将更容易出现问题柠檬