Swing/ViewportBorder のバックアップの現在との差分(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/ViewportBorder へ行く。
- 1 (2014-01-15 (水) 15:52:35)
- 2 (2014-10-28 (火) 21:26:36)
- 3 (2015-03-25 (水) 16:48:56)
- 4 (2017-02-17 (金) 14:18:31)
- 5 (2017-06-06 (火) 14:18:34)
- 6 (2017-10-23 (月) 16:11:19)
- 7 (2019-05-04 (土) 21:40:58)
- 8 (2020-04-10 (金) 23:01:09)
- 9 (2021-10-15 (金) 01:17:39)
- 10 (2022-08-20 (土) 22:15:25)
- 11 (2025-01-03 (金) 08:57:02)
- 12 (2025-01-03 (金) 09:01:23)
- 13 (2025-01-03 (金) 09:02:38)
- 14 (2025-01-03 (金) 09:03:21)
- 15 (2025-01-03 (金) 09:04:02)
- 16 (2025-06-19 (木) 12:41:37)
- 17 (2025-06-19 (木) 12:43:47)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- 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] * Summary [#summary] `JViewport`に`Border`を設定して余白を作成します。 #download(https://lh6.googleusercontent.com/-dtdRJtfyQqs/UtKoFiKxRVI/AAAAAAAAB-A/QmWEeAHNlmE/s800/ViewportBorder.png) * サンプルコード [#sourcecode] * Source Code Examples [#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); scroll2.setViewportBorder(BorderFactory.createLineBorder(textArea2.getBackground(), 5)); 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] * Description [#description] - 左: `JTextArea#setMargin(Insets)` -- `JTextArea`に`setMargin(Insets)`で余白を設定 -- 行変更などのカーソル移動で先頭や末尾の余白分まではスクロールされない -- 行変更などのカーソル移動で先頭や末尾の余白分まではスクロールせず、上記のスクリーンショットのように余白が見えない状態になる場合がある --- `Java 8`では再現しない? - 右: `JScrollPane#setViewportBorder(...)` -- `JTextArea#setMargin(new Insets(0, 0, 0, 1))`で`JTextArea`自体の余白を変更 --- すべて`0`の場合、一番長い行の末尾でキャレットが表示されない --- [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] --- %%すべて`0`の場合、一番長い行の末尾で`Caret`が表示されない%% `Java 9`で修正済み --- [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] * コメント [#comment] * Reference [#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 #comment