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