Java 实时刷新帧的内容
可能重复:Java 实时刷新帧的内容,java,swing,Java,Swing,可能重复: 我正在用Java编写一个Explorer程序,其工作原理如下 我从用户输入路径,在用户按下enter键后,设置一个文本框,计算文件夹列表,并创建相应的标签,这些标签应该显示在窗口上,但应用程序不显示文件夹的新内容,如果我更改文本,则它将指向一个新目录,因此当我按enter键时,它必须显示加载的新目录的内容,但只有在调整窗口大小后,它才会显示框架的新内容 代码如下 package explorer; import java.io.*; import java.util.*; impo
我正在用Java编写一个Explorer程序,其工作原理如下
我从用户输入路径,在用户按下enter键后,设置一个文本框,计算文件夹列表,并创建相应的标签,这些标签应该显示在窗口上
,但应用程序不显示文件夹的新内容,如果我更改文本,则它将指向一个新目录,因此当我按enter键时,它必须显示加载的新目录的内容,但只有在调整窗口大小后,它才会显示框架的新内容 代码如下
package explorer;
import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Explorer extends JFrame{
File file;
Scanner scan;
String path;
String [] listOfFiles;
JTextField txtPath;
JLabel lblLocation;
JLabel child[];
JPanel childPanel;
JPanel masterPanel;
public Explorer(){
lblLocation = new JLabel("Location: ");
/*
* the declaration of panels
*/
masterPanel = new JPanel();
childPanel = new JPanel();
JPanel panel = new JPanel();
/*declaration of other components*/
txtPath = new JTextField("",20);
/*addition of components to panel for layout*/
panel.add(lblLocation);
panel.add(txtPath);
/*adding to master panel, for sophisticated layout*/
masterPanel.add(panel, BorderLayout.NORTH);
masterPanel.add(childPanel, BorderLayout.SOUTH);
getContentPane().add(masterPanel);
/*this place from where address is fetched like /home/revolution/Desktop etc on ubuntu*/
txtPath.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev){
childPanel.removeAll();
path = new String(txtPath.getText());//the absolute path
file = new File(path);
File childFiles[];
String name = path.substring(path.lastIndexOf('/')+1, path.length());//the name of the directory being displayed
setTitle(name);
if(!file.isDirectory()){
JOptionPane.showMessageDialog(null, "Error file is not a directory");
} else {
listOfFiles = file.list();
child = new JLabel[listOfFiles.length];// labels equal to the number fo files and with name of the coresponding file/folder
childFiles = new File[listOfFiles.length];//references to files
childPanel.setLayout(new GridLayout(listOfFiles.length/2,listOfFiles.length/2));//setting grid layout
for(int i=0; i<listOfFiles.length;i++){
childFiles[i] = new File(listOfFiles[i]);
child[i] = new JLabel(listOfFiles[i]);
child[i].setToolTipText(childFiles[i].isFile()?"File":"Folder");
childPanel.add(child[i]);
}
childPanel.setVisible(true);
}
}
});
}
}
packageexplorer;
导入java.io.*;
导入java.util.*;
导入javax.swing.*;
导入java.awt.event.*;
导入java.awt.*;
公共类资源管理器扩展JFrame{
文件;
扫描仪扫描;
字符串路径;
字符串[]列表文件;
JTextField-txtPath;
JLabel-lballocation;
JLabel child[];
JPanel儿童小组;
JPanel主面板;
公共资源管理器(){
lblLocation=新的JLabel(“位置:”);
/*
*小组宣言
*/
主面板=新的JPanel();
childPanel=newjpanel();
JPanel面板=新的JPanel();
/*其他组成部分的声明*/
txtPath=新的JTextField(“,20);
/*将组件添加到面板以进行布局*/
面板。添加(LBallocation);
panel.add(txtPath);
/*添加到主面板,用于复杂布局*/
主面板。添加(面板,边框布局。北);
主面板。添加(子面板,边框布局。南);
getContentPane().add(主面板);
/*在ubuntu上获取地址的地方,如/home/revolution/Desktop等*/
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件ev){
childPanel.removeAll();
path=新字符串(txtPath.getText());//绝对路径
文件=新文件(路径);
文件childFiles[];
String name=path.substring(path.lastIndexOf('/')+1,path.length());//正在显示的目录的名称
片名(姓名);
如果(!file.isDirectory()){
showMessageDialog(null,“错误文件不是目录”);
}否则{
listOfFiles=file.list();
child=new JLabel[listOfFiles.length];//标签等于文件的数量,并且具有共同响应的文件/文件夹的名称
childFiles=新文件[listOfFiles.length];//对文件的引用
setLayout(新的网格布局(listOfFiles.length/2,listOfFiles.length/2));//设置网格布局
对于(inti=0;i我认为您需要打开面板
更准确地说,在动作侦听器的末尾,您可以添加childPanel.revalidate();
我想你需要加入小组
更准确地说,在动作侦听器的末尾,您可以添加childPanel.revalidate();
使用revalidate()方法根据新组件列表重置。revalidate()方法做什么?我还没有在任何一本书中遇到过它….@lucifer查看更多关于@nitichahajeruse revalidate()方法根据新组件列表重置的信息。revalidate()方法做什么方法是什么?我在任何一本书中都没有遇到过它….@lucifer请查看发布在@Nitinchajer的方法的更多信息,因为他正在移除组件,所以他还必须调用repaint()
在包含JPanel的面板上。但是,由于他只是更改子面板,因此在重新绘制整个子面板时,子面板上的重新验证
应该能够处理所有事情。不,如果他也正在移除组件,则不会。注意第一次调用actionPerformed(…)
方法--childPanel.removeAll()由于他正在移除组件,他还必须调用repaint()
在包含JPanel的面板上。但是,由于他只是更改子面板,因此在重新绘制整个子面板时,子面板上的重新验证
应该能够处理所有事情。不,如果他也正在移除组件,则不会。注意第一次调用actionPerformed(…)
方法--childPanel.removeAll();
childPanel.setVisible(true);
}
}
childPanel.revalidate();
});