Java 当JComponent在构造函数中创建时,我如何更新它?

Java 当JComponent在构造函数中创建时,我如何更新它?,java,swing,Java,Swing,下面我有一个构造器,我是Java新手,所以它可能比应该的要长,但它基本上是创建一个包含Jlist、play按钮和pause按钮的窗口。Jlist中将显示音乐文件的名称。在第一次启动时,程序应该询问音乐存储的目录 我的问题是,我想让用户选择一个新目录,但我不知道如何更新Jpanel上的Jlist,因为所有这些内容都是在构造函数中确定的。我唯一的想法是重新绘制整个Jframe、面板和组件,但这似乎是个坏主意。 在我的构造器下面,我发布了我试图做的事情,但那不起作用 Player(){

下面我有一个构造器,我是Java新手,所以它可能比应该的要长,但它基本上是创建一个包含Jlist、play按钮和pause按钮的窗口。Jlist中将显示音乐文件的名称。在第一次启动时,程序应该询问音乐存储的目录

我的问题是,我想让用户选择一个新目录,但我不知道如何更新Jpanel上的Jlist,因为所有这些内容都是在构造函数中确定的。我唯一的想法是重新绘制整个Jframe、面板和组件,但这似乎是个坏主意。 在我的构造器下面,我发布了我试图做的事情,但那不起作用

Player(){
        preferences = Preferences.userRoot().node(this.getClass().getName());
        ID = "Preferred Directory";
        preferences.get(ID,"");
        features = new PlayerFeatures();
        Ispaused = false;
        DataLine.Info dataInfo = new DataLine.Info(Clip.class,null);
        fileExplorer = new JFileChooser();
        fileExplorer.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        if(preferences.get(ID,"").equals("")){
            int returnVal = fileExplorer.showOpenDialog(chooseDirectory);
            if(returnVal == JFileChooser.APPROVE_OPTION){
                directory = fileExplorer.getCurrentDirectory();
                preferences.put(ID,directory.toString());
            }

        }

        directory = new File(preferences.get(ID,""));
        //get resource grabs things, with get resource we can grab things that are sitting in side the class folder.
        //directory = new File("C:\\Users\\Jude\\Documents\\musicalChairs\\src");

        List<String> list = makePlayList(directory);
        System.out.println(list);
        songs = new String[list.size()];
        songs = list.toArray(songs);
        playList = new JList(songs);
        playList.addMouseListener(new listMouseListener());
        playList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        playList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
        playList.setVisibleRowCount(-1);
        frame = new JFrame();
        panelTop = new JPanel();
        panelBottom = new JPanel();
        panelBottom.setLayout(new BoxLayout(panelBottom,BoxLayout.X_AXIS));
        play = new JButton();
        play.addActionListener(new playListener());
        pause = new JButton();
        pause.addActionListener(new pauseListener());
        scrollPane = new JScrollPane(playList);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        panelTop.add(scrollPane);
        menuBar = new JMenuBar();
        menu = new JMenu("File");
        menu.setMnemonic(KeyEvent.VK_F);
        chooseDirectory = new JMenuItem("Select Music Folder",KeyEvent.VK_S);
        chooseDirectory.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1,ActionEvent.ALT_MASK));
        chooseDirectory.addActionListener(new chooseDirectoryListener());
        menu.add(chooseDirectory);
        menuBar.add(menu);
        frame.setJMenuBar(menuBar);
        try{
            Image img = ImageIO.read(getClass().getResource("Play24.gif"));
            Image pauseImg = ImageIO.read(getClass().getResource("Pause16.gif"));
            play.setIcon(new ImageIcon(img));
            pause.setIcon(new ImageIcon(pauseImg));
            Dimension buttonDimensions = new Dimension(25,26);
            play.setPreferredSize(buttonDimensions);
            pause.setPreferredSize(buttonDimensions);


        }catch(IllegalArgumentException ex){
            System.out.println("No input exist");
            ex.printStackTrace();
        }catch(IOException ioe){
            System.out.println("Error while reading");
            ioe.printStackTrace();
        }


        features.songURL = Player.class.getResource(songs[0]);
        panelBottom.add(play);
        panelBottom.add(pause);
        frame.getContentPane().add(BorderLayout.WEST,panelTop);
        frame.getContentPane().add(BorderLayout.SOUTH,panelBottom);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300,250);
        frame.setVisible(true);
    }
class chooseDirectoryListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            int returnVal = fileExplorer.showOpenDialog(chooseDirectory);
            if(returnVal == JFileChooser.APPROVE_OPTION){
                directory = fileExplorer.getCurrentDirectory();
                preferences.put(ID,directory.toString());
                List<String> list = makePlayList(directory);
                songs = new String[list.size()];
                songs = list.toArray(songs);
                playList = new JList(songs);
                playList.addMouseListener(new listMouseListener());
                playList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
                playList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
                playList.setVisibleRowCount(-1);
                scrollPane = new JScrollPane(playList);
                scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
                scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                panelTop.add(scrollPane);
                System.out.println("why");
                panelTop.revalidate();
                panelTop.repaint();

            }

        }
    }
Player(){
preferences=preferences.userRoot().node(this.getClass().getName());
ID=“首选目录”;
preferences.get(ID,“”);
功能=新的播放器功能();
Ispaused=false;
DataLine.Info dataInfo=newdataline.Info(Clip.class,null);
fileExplorer=newjfilechooser();
fileExplorer.setFileSelectionMode(JFileChooser.FILES_和_目录);
if(preferences.get(ID)(“”).equals(“”){
int returnVal=fileExplorer.showOpenDialog(选择目录);
if(returnVal==JFileChooser.APPROVE_选项){
directory=fileExplorer.getCurrentDirectory();
preferences.put(ID,directory.toString());
}
}
directory=新文件(preferences.get(ID)(“”);
//get resource抓取东西,使用get resource我们可以抓取位于类文件夹旁边的东西。
//目录=新文件(“C:\\Users\\Jude\\Documents\\musicalChairs\\src”);
List List=makePlayList(目录);
系统输出打印项次(列表);
歌曲=新字符串[list.size()];
歌曲=列表。toArray(歌曲);
播放列表=新列表(歌曲);
playList.addMouseListener(新的listMouseListener());
播放列表。设置选择模式(列表选择模式。单间隔选择);
playList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
playList.setVisibleRowCount(-1);
frame=新的JFrame();
panelTop=新的JPanel();
panelBottom=新的JPanel();
panelBottom.setLayout(新的BoxLayout(panelBottom,BoxLayout.X_轴));
play=新的JButton();
play.addActionListener(新的playener());
pause=新的JButton();
addActionListener(新的pauseListener());
scrollPane=新的JScrollPane(播放列表);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HorizontalScrollBar\uNever);
panelTop.add(滚动窗格);
menuBar=newjmenubar();
菜单=新JMenu(“文件”);
menu.set助记符(KeyEvent.VK_F);
选择directory=newjmenuItem(“选择音乐文件夹”,KeyEvent.vks);
选择directory.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1,ActionEvent.ALT_MASK));
chooseDirectory.addActionListener(新建chooseDirectoryListener());
菜单.添加(选择目录);
菜单栏。添加(菜单);
frame.setJMenuBar(菜单栏);
试一试{
Image img=ImageIO.read(getClass().getResource(“Play24.gif”);
Image pauseImg=ImageIO.read(getClass().getResource(“Pause16.gif”);
play.setIcon(新图像图标(img));
pause.setIcon(新图像图标(pauseImg));
尺寸按钮尺寸=新尺寸(25,26);
play.setPreferredSize(按钮尺寸);
暂停。设置首选大小(按钮尺寸);
}捕获(IllegalArgumentException ex){
System.out.println(“不存在输入”);
例如printStackTrace();
}捕获(ioe异常ioe){
System.out.println(“读取时出错”);
ioe.printStackTrace();
}
features.songURL=Player.class.getResource(歌曲[0]);
面板底部。添加(播放);
panelBottom.add(暂停);
frame.getContentPane().add(BorderLayout.WEST,panelTop);
frame.getContentPane().add(BorderLayout.SOUTH,panelBottom);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(300250);
frame.setVisible(true);
}
类chooseDirectoryListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
int returnVal=fileExplorer.showOpenDialog(选择目录);
if(returnVal==JFileChooser.APPROVE_选项){
directory=fileExplorer.getCurrentDirectory();
preferences.put(ID,directory.toString());
List List=makePlayList(目录);
歌曲=新字符串[list.size()];
歌曲=列表。toArray(歌曲);
播放列表=新列表(歌曲);
playList.addMouseListener(新的listMouseListener());
播放列表。设置选择模式(列表选择模式。单间隔选择);
playList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
playList.setVisibleRowCount(-1);
scrollPane=新的JScrollPane(播放列表);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HorizontalScrollBar\uNever);
panelTop.add(滚动窗格);
System.out.println(“为什么”);
panelTop.revalidate();
panelTop.repaint();
}
}
}

如果你实现了你想要做的事情,使用一个。像这样的应该可以工作,尽管没有经过测试

private DefaultListModel model = new DefaultListModel;

public Constructor () {
    JList playlist = new JList(model);
    panelTop.add(playlist);
    ...
}

public void addItem (String item) {
    model.add(0, item);
}

public void removeItem (String item) {
    model.remove(model.indexOf(item));
}

public void clearItems () {
    model.clear();
}
下面是一个相对仓促的尝试,以测试删除和添加项目后列表是否会更新。它已按预期进行测试

JFrame frame = new JFrame();
JPanel panel = new 

DefaultListModel model = new DefaultListModel();
model.add(0, "Item 0");
model.add(1, "Item 1");

JList list = new JList(model);

frame.add(panel);
panel.add(list);

frame.setVisible(true);

model.remove(0);
model.add(1, "Item 234");
可以吗