---
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
---
* 概要 [#summary]
`JViewport`に`Border`を設定して余白を作成します。

#download(https://lh6.googleusercontent.com/-dtdRJtfyQqs/UtKoFiKxRVI/AAAAAAAAB-A/QmWEeAHNlmE/s800/ViewportBorder.png)

* サンプルコード [#sourcecode]
#code(link){{
JTextArea textArea1 = new JTextArea("JTextArea#setMargin(Insets)\n\n" + INIT_TXT);
textArea1.setMargin(new Insets(5, 5, 5, 5));
JScrollPane scroll1 = new JScrollPane(textArea1);

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

* 解説 [#explanation]
- 左: `JTextArea#setMargin(Insets)`
-- `JTextArea`に`setMargin(Insets)`で余白を設定
-- 行変更などのカーソル移動で先頭や末尾の余白分まではスクロールせず、上記のスクリーンショットのように余白が見えない状態になる場合がある
--- `Java 8`では再現しない?
- 右: `JScrollPane#setViewportBorder(...)`
-- `JTextArea#setMargin(new Insets(0, 0, 0, 1))`で`JTextArea`自体の余白を変更
--- %%すべて`0`の場合、一番長い行の末尾で`Caret`が表示されない%% `Java 9`で修正済み
--- [https://bugs.openjdk.java.net/browse/JDK-6866751 JDK-6866751 J2SE_Swing_Reg: the caret disappears when moving to the end of the line. - Java Bug System]
--- [https://bugs.openjdk.org/browse/JDK-6866751 JDK-6866751 J2SE_Swing_Reg: the caret disappears when moving to the end of the line. - Java Bug System]
-- `JScrollPane#setViewportBorder(...)`で`JViewport`の周囲に余白を設定
--- スクロールバーなどの有無によらずこの余白は常に表示されている
-- 余白は`View`に設定したコンポーネントの背景色と色の`LineBorder`で描画
--- `EmptyBorder`にすると`JScrollPane`の背景色が表示されてしまう

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/text/JTextComponent.html#setMargin-java.awt.Insets- JTextComponent#setMargin(...) (Java Platform SE 8)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JScrollPane.html#setViewportBorder-javax.swing.border.Border- JScrollPane#setViewportBorder(...) (Java Platform SE 8)]

* コメント [#comment]
#comment
#comment