# Java Swing File Loading with JFileChooser
Here's a complete example of how to use `JFileChooser` to load files in a Java Swing application:
## Basic File Loading Example
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class FileLoader extends JFrame {
private JTextArea contentArea;
private JButton loadButton;
public FileLoader() {
setTitle("File Loader");
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// Create components
contentArea = new JTextArea();
contentArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(contentArea);
loadButton = new JButton("Load File");
loadButton.addActionListener(this::loadFileAction);
// Add components to frame
add(scrollPane, BorderLayout.CENTER);
add(loadButton, BorderLayout.SOUTH);
}
private void loadFileAction(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Select a file to load");
// Set default directory (optional)
fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
// File filters (optional)
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
fileChooser.setAcceptAllFileFilterUsed(false);
fileChooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() {
@Override
public boolean accept(File f) {
return f.isDirectory() ||
f.getName().toLowerCase().endsWith(".txt") ||
f.getName().toLowerCase().endsWith(".java");
}
@Override
public String getDescription() {
return "Text Files (*.txt, *.java)";
}
});
int returnValue = fileChooser.showOpenDialog(this);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
loadFileContent(selectedFile);
}
}
private void loadFileContent(File file) {
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
contentArea.setText(""); // Clear previous content
String line;
while ((line = reader.readLine()) != null) {
contentArea.append(line + "\n");
}
setTitle("File Loader - " + file.getName());
} catch (IOException e) {
JOptionPane.showMessageDialog(this,
"Error reading file: " + e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
FileLoader loader = new FileLoader();
loader.setVisible(true);
});
}
}
```
## Advanced Features
### 1. Multiple File Selection
```java
fileChooser.setMultiSelectionEnabled(true);
// In the action listener:
if (returnValue == JFileChooser.APPROVE_OPTION) {
File[] selectedFiles = fileChooser.getSelectedFiles();
for (File file : selectedFiles) {
loadFileContent(file);
}
}
```
### 2. Remember Last Directory
```java
// Add class field
private File lastDirectory;
// In constructor
lastDirectory = new File(System.getProperty("user.home"));
// In file chooser setup
fileChooser.setCurrentDirectory(lastDirectory);
// After file selection
lastDirectory = fileChooser.getSelectedFile().getParentFile();
```
### 3. File Preview Panel
```java
fileChooser.setAccessory(new FilePreview(fileChooser));
// FilePreview class
class FilePreview extends JPanel {
private JLabel iconLabel = new JLabel();
private JTextArea infoArea = new JTextArea(5, 20);
public FilePreview(JFileChooser chooser) {
setLayout(new BorderLayout());
infoArea.setEditable(false);
infoArea.setLineWrap(true);
infoArea.setWrapStyleWord(true);
add(iconLabel, BorderLayout.NORTH);
add(new JScrollPane(infoArea), BorderLayout.CENTER);
setPreferredSize(new Dimension(200, 150));
chooser.addPropertyChangeListener(e -> {
if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(e.getPropertyName())) {
File file = chooser.getSelectedFile();
updatePreview(file);
}
});
}
private void updatePreview(File file) {
if (file == null || file.isDirectory()) {
iconLabel.setIcon(null);
infoArea.setText("No file selected");
return;
}
iconLabel.setIcon(UIManager.getIcon(file.isDirectory() ?
"FileView.directoryIcon" : "FileView.fileIcon"));
infoArea.setText(String.format(
"Name: %s\nSize: %d bytes\nPath: %s",
file.getName(),
file.length(),
file.getAbsolutePath()
));
}
}
```
### 4. Drag and Drop Support
```java
// Add to constructor
contentArea.setDragEnabled(true);
new DropTarget(contentArea, new DropTargetAdapter() {
@Override
public void drop(DropTargetDropEvent dtde) {
try {
dtde.acceptDrop(DnDConstants.ACTION_COPY);
Transferable transferable = dtde.getTransferable();
if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
@SuppressWarnings("unchecked")
java.util.List<File> fileList = (java.util.List<File>)
transferable.getTransferData(DataFlavor.javaFileListFlavor);
if (!fileList.isEmpty()) {
loadFileContent(fileList.get(0));
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(FileLoader.this,
"Error handling dropped file: " + e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
});
```
## File Chooser Customization Options
1. **Different Selection Modes**:
```java
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); // Default
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
```
2. **Custom File Filters**:
```java
// Image files filter
fileChooser.addChoosableFileFilter(new FileNameExtensionFilter(
"Image Files", "jpg", "png", "gif"));
// Document files filter
fileChooser.addChoosableFileFilter(new FileNameExtensionFilter(
"Document Files", "doc", "docx", "pdf", "txt"));
```
3. **Custom Dialog Buttons**:
```java
fileChooser.setApproveButtonText("Import");
fileChooser.setApproveButtonToolTipText("Import selected file");
```
4. **Custom Icons**:
```java
fileChooser.setFileView(new FileView() {
@Override
public Icon getIcon(File f) {
if (f.getName().endsWith(".java")) {
return new ImageIcon("java_icon.png");
}
return super.getIcon(f);
}
});
```
This implementation provides a robust file loading mechanism with `JFileChooser` that can be easily integrated into any Java Swing application. The examples cover basic file loading, multiple file selection, directory remembering, preview functionality, and drag-and-drop support.
No comments:
Post a Comment