Swing 提供三大核心文字元件:單行輸入 JTextField、密碼輸入 JPasswordField、多行文字區 JTextArea。本文系統整理建構子、常用方法、事件處理、捲動面板整合、登入表單與文字編輯器實戰範例。
| 建構子 | 說明 |
|---|---|
JTextField() | 空白、欄寬 0 |
JTextField(int columns) | 指定欄寬 (字元數) |
JTextField(String text) | 預設文字 |
JTextField(String text, int columns) | 預設文字 + 欄寬 |
JPasswordField 繼承 JTextField,差別在於:getPassword() 回傳 char[] (安全)、setEchoChar('*') 設定遮罩字元。
setText/getText:設定/取得文字 (JPasswordField 用 getPassword())。setEditable(false):唯讀模式。setColumns(int):調整顯示寬度。addActionListener:Enter 鍵觸發動作事件。requestFocus():程式化聚焦。| 建構子 | 說明 |
|---|---|
JTextArea() | 空白 |
JTextArea(String text) | 預設文字 |
JTextArea(int rows, int cols) | 指定行/列數 (建議尺寸) |
JTextArea(String text, int rows, int cols) | 全指定 |
JTextArea area = new JTextArea(10, 30);
area.setLineWrap(true); // 自動換行
area.setWrapStyleWord(true); // 整詞換行 (不斷字)
area.setTabSize(4); // Tab 寬度
area.setFont(new Font("微軟正黑體", Font.PLAIN, 16));
area.setBackground(Color.WHITE);
JScrollPane scroll = new JScrollPane(area,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
container.add(scroll, BorderLayout.CENTER);
否則文字超出可視區無法捲動。
public class LoginForm extends JFrame {
private JTextField tfUser = new JTextField(15);
private JPasswordField pfPass = new JPasswordField(15);
private JLabel lblMsg = new JLabel(" ");
public LoginForm() {
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(5,5,5,5);
c.anchor = GridBagConstraints.WEST;
addRow("帳號:", tfUser, 0);
addRow("密碼:", pfPass, 1);
JPanel btnPanel = new JPanel();
JButton btnLogin = new JButton("登入");
JButton btnReset = new JButton("重置");
btnPanel.add(btnLogin); btnPanel.add(btnReset);
c.gridx = 0; c.gridy = 2; c.gridwidth = 2;
add(btnPanel, c);
c.gridy = 3; c.gridwidth = 2;
add(lblMsg, c);
btnLogin.addActionListener(e -> doLogin());
btnReset.addActionListener(e -> { tfUser.setText(""); pfPass.setText(""); lblMsg.setText(" "); tfUser.requestFocus(); });
pack(); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void addRow(String label, JComponent field, int row) {
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0; c.gridy = row; add(new JLabel(label), c);
c.gridx = 1; add(field, c);
}
private void doLogin() {
String user = tfUser.getText().trim();
char[] pass = pfPass.getPassword();
if ("admin".equals(user) && Arrays.equals("123456".toCharArray(), pass)) {
lblMsg.setText("登入成功!");
} else {
lblMsg.setText("帳號或密碼錯誤");
}
Arrays.fill(pass, ' '); // 清除記憶體殘留
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new LoginForm().setVisible(true));
}
}
public class MiniEditor extends JFrame {
private JTextArea area = new JTextArea(20, 60);
public MiniEditor() {
area.setLineWrap(true);
area.setWrapStyleWord(true);
area.setFont(new Font("Monospaced", Font.PLAIN, 14));
JScrollPane scroll = new JScrollPane(area);
add(scroll, BorderLayout.CENTER);
JToolBar bar = new JToolBar();
bar.add(new AbstractAction("剪下") { public void actionPerformed(ActionEvent e) { area.cut(); }});
bar.add(new AbstractAction("複製") { public void actionPerformed(ActionEvent e) { area.copy(); }});
bar.add(new AbstractAction("貼上") { public void actionPerformed(ActionEvent e) { area.paste(); }});
bar.addSeparator();
bar.add(new AbstractAction("全選") { public void actionPerformed(ActionEvent e) { area.selectAll(); }});
add(bar, BorderLayout.NORTH);
pack(); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new MiniEditor().setVisible(true));
}
}
area.getDocument().addDocumentListener(...) 即時統計字數、啟用/禁用儲存按鈕。DocumentFilter 或使用 RSyntaxTextArea 等第三方庫。DefaultStyledDocument + 分頁載入,避免一次載入巨大檔案導致 UI 凍結。掌握三大文字元件的建構細節、事件模型、捲動整合與安全處理 (密碼 char[]),即可打造從簡單表單到功能完整編輯器的各類文字介面。