• category: swing folder: ExpandingTextArea title: JTextAreaにフォーカスが当たったときその高さを自動拡張する tags: [JTextArea, FocusListener, JLabel, CardLayout] author: aterai pubdate: 2017-03-20T03:11:21+09:00 description: JTextAreaにフォーカスが当たったときその高さを自動拡張、外れたときに縮小します。 image: https://drive.google.com/uc?export=view&id=11MUj8pt3sndJr2o7ebuYFDE4gaRnE4AklA hreflang:
       href: https://java-swing-tips.blogspot.com/2017/12/automatically-extend-its-height-when.html
       lang: en

概要

JTextAreaにフォーカスが当たったときその高さを自動拡張、外れたときに縮小します。

サンプルコード

textArea.addFocusListener(new FocusAdapter() {
  @Override public void focusLost(FocusEvent e) {
    String text = textArea.getText();
    label.setText(text.isEmpty() ? " " : text);
    cardLayout.show(cp, "TextField");
  }
});
label.addFocusListener(new FocusAdapter() {
  @Override public void focusGained(FocusEvent e) {
    cardLayout.show(cp, "TextArea");
    textArea.requestFocusInWindow();
  }
});
View in GitHub: Java, Kotlin

解説

  • 上: JTextArea + FocusListener
    • JTextAreaにフォーカスが当たったときJTextArea#setRows(...)で行数を拡張、外れたときに一行に縮小
    • 複数行分の文字列が入力されている状態で一行に縮小した場合、JScrollPaneのスクロールボタンが表示される
  • 下: JLabel + JTextArea + CardLayout + FocusListener
    • フォーカス可能に設定したJLabelJTextFieldの文字色、背景色などを設定し、フォーカス状態が変更されたときCardLayoutでこれをJTextAreaと切り替えることで拡張縮小を実行
    • 複数行分の文字列が入力されている状態で一行に縮小した場合、JLabelのデフォルトの切り詰めで末尾が...に置換表示される
    • JLabelが空の場合、その高さが0になってしまうので、その場合は空白文字を追加することで回避

参考リンク

コメント