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创建更多的类实例,它们将更容易出现问题柠檬