• category: swing folder: ViewportBorder title: JViewportにBorderを設定する tags: [JViewport, Border, JScrollPane, JTextArea, Caret] author: aterai pubdate: 2014-01-13T00:01:30+09:00 description: JViewportにBorderを設定して余白を作成します。 image: https://lh6.googleusercontent.com/-dtdRJtfyQqs/UtKoFiKxRVI/AAAAAAAAB-A/QmWEeAHNlmE/s800/ViewportBorder.png

概要

概要

JViewportBorderを設定して余白を作成します。

サンプルコード

サンプルコード

#spandel
JTextArea textArea2 = new JTextArea("JScrollPane#setViewportBorder(...)\n\n" + initTxt);
#spanend
#spandel
textArea2.setMargin(new Insets(0,0,0,0));
#spanend
#spandel
JScrollPane scroll2 = new JScrollPane(textArea2);
#spanend
#spandel
scroll2.setViewportBorder(BorderFactory.createLineBorder(textArea2.getBackground(), 5));
#spanend
#spanadd
JTextArea textArea1 = new JTextArea("JTextArea#setMargin(Insets)\n\n" + INIT_TXT);
#spanend
#spanadd
textArea1.setMargin(new Insets(5, 5, 5, 5));
#spanend
#spanadd
JScrollPane scroll1 = new JScrollPane(textArea1);
#spanend
#spanadd

#spanend
#spanadd
JTextArea textArea2 = new JTextArea("JScrollPane#setViewportBorder(...)\n\n" + INIT_TXT);
#spanend
#spanadd
textArea2.setMargin(new Insets(0, 0, 0, 1));
#spanend
#spanadd
JScrollPane scroll2 = new JScrollPane(textArea2) {
#spanend
  @Override public void updateUI() {
    setViewportBorder(null);
    super.updateUI();
    EventQueue.invokeLater(() -> {
      Component c = getViewport().getView();
      setViewportBorder(BorderFactory.createLineBorder(c.getBackground(), 5));
    });
#spanadd
};
#spanend
#spanadd
// scroll2.setViewportBorder(BorderFactory.createLineBorder(textArea2.getBackground(), 5));
#spanend
View in GitHub: Java, Kotlin

解説

解説

  • 左: JTextArea#setMargin(Insets)
    • JTextAreasetMargin(Insets)で余白を設定
    • 行変更などのカーソル移動で先頭や末尾の余白分まではスクロールされない
    • 行変更などのカーソル移動で先頭や末尾の余白分まではスクロールせず、上記のスクリーンショットのように余白が見えない状態になる場合がある
      • Java 8では再現しない?
  • 右: JScrollPane#setViewportBorder(...)
    • JTextArea#setMargin(new Insets(0,0,0,1))JTextArea自体の余白を変更
      • すべて0の場合、一番長い行の末尾でキャレットが表示されない
    • JTextArea#setMargin(new Insets(0, 0, 0, 1))JTextArea自体の余白を変更
    • JScrollPane#setViewportBorder(...)JViewportの周囲に余白を設定
      • スクロールバーなどの有無によらず、この余白は常に表示されている
      • スクロールバーなどの有無によらずこの余白は常に表示されている
    • 余白はViewに設定したコンポーネントの背景色と色のLineBorderで描画
      • EmptyBorderにするとJScrollPaneの背景色が表示されてしまう

コメント

参考リンク

コメント