利用 JFileChooser 選取檔案,搭配 JTextPane 載入純文字內容,是 Swing 桌面應用常見需求。本文提供可直接編譯執行的完整範例,修正原始碼中「建構子重複定義」、「chooser 初始化時機」等問題,並補充最佳實踐說明。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class FileOpenerDemo extends JFrame implements ActionListener {
private JButton btnOpen;
private JTextPane textPane;
private JFileChooser chooser = new JFileChooser(); // 成員變數初始化
public FileOpenerDemo() {
super("文字檔開啟示範");
btnOpen = new JButton("開啟檔案選擇器");
btnOpen.addActionListener(this);
textPane = new JTextPane();
textPane.setEditable(false);
JScrollPane scroll = new JScrollPane(textPane);
Container con = getContentPane();
con.setLayout(new BorderLayout());
con.add(btnOpen, BorderLayout.NORTH);
con.add(scroll, BorderLayout.CENTER);
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 置中
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnOpen) {
int state = chooser.showOpenDialog(this);
if (state == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
try (FileInputStream fis = new FileInputStream(file)) {
textPane.read(fis, this); // 載入純文字
} catch (IOException ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(this, "讀取失敗:" + ex.getMessage());
}
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(FileOpenerDemo::new);
}
}
Jfilechooser 類別與獨立 mywindow,已合併為單一 FileOpenerDemo。FileInputStream。chooser.setFileFilter(new FileNameExtensionFilter("文字檔", "txt", "log", "csv"));Files.readString(path, StandardCharsets.UTF_8) 讀取並 textPane.setText(),解決中文亂碼。BufferedReader 分行讀取或虛擬滾動,避免 OOM。DropTargetListener 允許直接拖曳檔案至文字區。