Java窗體動(dòng)態(tài)加載磁盤文件的實(shí)現(xiàn)方法
在使用圖形界面操作系統(tǒng)時(shí),當(dāng)打開(kāi)一個(gè)文件夾系統(tǒng)會(huì)自動(dòng)列出該文件夾下的所有文件及子文件夾。本實(shí)例實(shí)現(xiàn)了類似的功能:首先讓用戶選擇一個(gè)文件夾,程序會(huì)動(dòng)態(tài)列出該文件夾下的所有文件;如果該文件是隱藏文件,就在屬性欄中顯示“隱藏文件”。要用到進(jìn)度條來(lái)表示是否完成。
思路如下:
首先是視圖層。JTextField、JButton、JScrollPane、JTable神馬的就不用再提了,都是老盆友了,在這里因?yàn)橐玫竭M(jìn)度條,所以會(huì)有一個(gè)新盆友:JProgressBar控件。控件們自然是要作為成員變量創(chuàng)建對(duì)象的,此外還要有File型成員變量來(lái)代表選中的文件夾。
這個(gè)實(shí)例只涉及了一個(gè)控件的事件,那就是選擇文件夾按鈕。在它的事件里,選擇文件夾及列出信息神馬的都是老生常談了,關(guān)鍵是JProgressBar控件的用法。在用戶選擇文件夾后,使用JProgressBar控件的setIndeterminate(true)方法設(shè)置滾動(dòng)條開(kāi)始滾動(dòng);在文件信息顯示完畢后,再通過(guò)JProgressBar控件的setIndeterminate(false)方法停止?jié)L動(dòng)條的滾動(dòng)。
代碼如下:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.UIManager;
public class FileListFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = -615665572894071265L;
private JPanel contentPane;
private JTextField chooseTextField;
private JButton chooseButton;
private JScrollPane scrollPane;
private JTable table;
private JProgressBar progressBar;
private File chooseFile;
/**
* Launch the application.
*/
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Throwable e) {
e.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FileListFrame frame = new FileListFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FileListFrame() {
setTitle("\u7A97\u4F53\u52A8\u6001\u52A0\u8F7D\u78C1\u76D8\u6587\u4EF6");
addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent arg0) {
do_this_windowActivated(arg0);
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0));
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.NORTH);
chooseTextField = new JTextField();
panel.add(chooseTextField);
chooseTextField.setColumns(13);
chooseButton = new JButton("\u9009\u62E9\u6587\u4EF6\u5939");
chooseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
do_chooseButton_actionPerformed(arg0);
}
});
panel.add(chooseButton);
progressBar = new JProgressBar();
panel.add(progressBar);
scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);
table = new JTable();
scrollPane.setViewportView(table);
}
protected void do_chooseButton_actionPerformed(ActionEvent arg0) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setMultiSelectionEnabled(false);
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
chooseFile = fileChooser.getSelectedFile();// 獲得用戶選擇的文件夾
chooseTextField.setText(chooseFile.getAbsolutePath());// 顯示用戶選擇的文件夾
progressBar.setIndeterminate(true);// 設(shè)置滾動(dòng)條開(kāi)始滾動(dòng)
final File[] subFiles = chooseFile.listFiles();// 獲得用戶選擇的文件夾中的所有文件(夾)
final DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setRowCount(0);// 清空表格
new Thread() {// 開(kāi)始新的線程
public void run() {
for (int i = 0; i < subFiles.length; i++) {// 遍歷用戶選擇的文件夾
if (subFiles[i].isFile()) {// 判斷是否是一個(gè)文件
Object[] property = new Object[3];
property[0] = i + 1;// 保存序號(hào)
property[1] = subFiles[i].getName();// 保存文件名
property[2] = "";
if (subFiles[i].isHidden()) {// 判斷是否是一個(gè)隱藏文件
property[2] = "隱藏文件";
}
model.addRow(property);// 向表格中添加記錄
table.setModel(model);// 更新表格
}
try {
Thread.sleep(100);// 線程休眠0.1秒實(shí)現(xiàn)動(dòng)態(tài)加載
} catch (InterruptedException e) {
e.printStackTrace();
}
}
progressBar.setIndeterminate(false);// 停止進(jìn)度條滾動(dòng)
};
}.start();
}
}
protected void do_this_windowActivated(WindowEvent arg0) {
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setColumnIdentifiers(new Object[] { "序號(hào)", "文件名", "屬性" });
}
}
效果如圖:

- Java動(dòng)態(tài)加載類示例詳解
- java 利用java反射機(jī)制動(dòng)態(tài)加載類的簡(jiǎn)單實(shí)現(xiàn)
- java實(shí)現(xiàn)動(dòng)態(tài)編譯并動(dòng)態(tài)加載
- java動(dòng)態(tài)加載插件化編程詳解
- Java 動(dòng)態(tài)加載jar和class文件實(shí)例解析
- java 動(dòng)態(tài)加載的實(shí)現(xiàn)代碼
- 詳解Java動(dòng)態(tài)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)
- Java反射之靜態(tài)加載和動(dòng)態(tài)加載的簡(jiǎn)單實(shí)例
- 詳解Java類動(dòng)態(tài)加載和熱替換
相關(guān)文章
springboot基于過(guò)濾器實(shí)現(xiàn)接口請(qǐng)求耗時(shí)統(tǒng)計(jì)操作
這篇文章主要介紹了springboot基于過(guò)濾器實(shí)現(xiàn)接口請(qǐng)求耗時(shí)統(tǒng)計(jì)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
JDK21無(wú)法導(dǎo)入TimeUnit類的解決辦法
這篇文章主要給大家介紹了關(guān)于JDK21無(wú)法導(dǎo)入TimeUnit類的解決辦法,TimeUnit是java.util.concurrent包下面的一個(gè)類,TimeUnit提供了可讀性更好的線程暫停操作,通常用來(lái)替換Thread.sleep(),需要的朋友可以參考下2024-01-01
Java 使用Calendar計(jì)算時(shí)間的示例代碼
這篇文章主要介紹了Java 使用Calendar計(jì)算時(shí)間的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
全面解析SpringBoot自動(dòng)配置的實(shí)現(xiàn)原理
這篇文章主要介紹了全面解析SpringBoot自動(dòng)配置的實(shí)現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java Spring WEB應(yīng)用實(shí)例化如何實(shí)現(xiàn)
這篇文章主要介紹了Java Spring WEB應(yīng)用實(shí)例化如何實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
詳解java 中Spring jsonp 跨域請(qǐng)求的實(shí)例
這篇文章主要介紹了詳解java 中Spring jsonp 跨域請(qǐng)求的實(shí)例的相關(guān)資料,jsonp 可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問(wèn)的問(wèn)題,需要的朋友可以參考下2017-08-08
Java按時(shí)間梯度實(shí)現(xiàn)異步回調(diào)接口的方法
這篇文章主要介紹了Java按時(shí)間梯度實(shí)現(xiàn)異步回調(diào)接口,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
SpringBoot配置Actuator組件,實(shí)現(xiàn)系統(tǒng)監(jiān)控
在生產(chǎn)環(huán)境中,需要實(shí)時(shí)或定期監(jiān)控服務(wù)的可用性。Spring Boot的actuator(健康監(jiān)控)功能提供了很多監(jiān)控所需的接口,可以對(duì)應(yīng)用系統(tǒng)進(jìn)行配置查看、相關(guān)功能統(tǒng)計(jì)等。2021-06-06
Java并發(fā)編程service層處理并發(fā)事務(wù)加鎖可能會(huì)無(wú)效問(wèn)題
這篇文章主要介紹了Java并發(fā)編程service層處理并發(fā)事務(wù)加鎖可能會(huì)無(wú)效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
使用Spring Data Redis實(shí)現(xiàn)數(shù)據(jù)緩存的方法
目前在系統(tǒng)架構(gòu)設(shè)計(jì)中使用Redis實(shí)現(xiàn)緩存,這篇文章主要介紹了使用Spring Data Redis實(shí)現(xiàn)數(shù)據(jù)緩存的方法,具有一定的參考價(jià)值,需要的朋友可以參考下2018-11-11

