Swing/OneLineTextPane のバックアップ差分(No.3)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/OneLineTextPane へ行く。
- 1 (2013-05-06 (月) 00:34:13)
- 2 (2013-05-06 (月) 15:23:34)
- 3 (2013-05-06 (月) 18:01:49)
- 4 (2013-05-06 (月) 21:05:07)
- 5 (2013-07-26 (金) 01:55:46)
- 6 (2013-07-27 (土) 02:00:09)
- 7 (2013-08-18 (日) 04:41:59)
- 8 (2013-08-20 (火) 14:25:17)
- 9 (2013-11-01 (金) 17:53:52)
- 10 (2013-11-02 (土) 03:32:53)
- 11 (2014-09-17 (水) 13:17:20)
- 12 (2014-10-22 (水) 00:49:41)
- 13 (2014-11-08 (土) 01:41:12)
- 14 (2014-11-26 (水) 18:30:10)
- 15 (2015-01-14 (水) 15:33:16)
- 16 (2016-06-20 (月) 14:32:13)
- 17 (2016-06-20 (月) 16:17:59)
- 18 (2017-09-19 (火) 06:33:09)
- 19 (2017-10-27 (金) 16:26:13)
- 20 (2017-11-02 (木) 15:32:16)
- 21 (2019-03-22 (金) 19:00:38)
- 22 (2019-08-15 (木) 14:42:41)
- 23 (2021-04-11 (日) 00:33:28)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTextPaneを一行に制限してスタイル可能なJTextFieldとして使用する #navi(../) #tags(JTextPane, StyledDocument, JScrollPane, JTextField, KeyboardFocusManager, Focus, InputMap) RIGHT:Posted by &author(aterai); at 2013-05-06 *JTextPaneを一行に制限してスタイル可能なJTextFieldとして使用する [#i94a5c71] ``JTextPane``の行数を一行のみに制限して、文字色などのスタイル付けが可能な``JTextField``として使用します。 -&jnlp; -&jar; -&zip; //#screenshot #ref(https://lh4.googleusercontent.com/-jckifA3Ym6c/UYZlsvWPTqI/AAAAAAAABrY/ERGHE6rtaPo/s800/OneLineTextPane.png) **サンプルコード [#la6c46b8] #code(link){{ JTextPane textPane = new JTextPane() { // @see http://www.java2s.com/Code/Java/Swing-JFC/NonWrappingWrapTextPane.htm @Override public boolean getScrollableTracksViewportWidth() { Component parent = getParent(); ComponentUI ui = getUI(); return parent != null ? (ui.getPreferredSize(this).width<=parent.getSize().width) : true; } @Override public void scrollRectToVisible(Rectangle rect) { int r = getBorder().getBorderInsets(this).right; rect.grow(r, 0); super.scrollRectToVisible(rect); } }; textPane.setEditorKit(new NoWrapEditorKit()); AbstractDocument doc = new SimpleSyntaxDocument(); textPane.setDocument(doc); try { doc.insertString(0, text, null); } catch(Exception ex) { ex.printStackTrace(); } InputMap im = textPane.getInputMap(JComponent.WHEN_FOCUSED); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { // Do nothing } }); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { // Do nothing } }); // @see http://terai.xrea.jp/Swing/FocusTraversalKeys.html Set<AWTKeyStroke> forwardKeys = new HashSet<AWTKeyStroke>( textPane.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)); forwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0)); forwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.SHIFT_MASK)); textPane.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys); JScrollPane scrollPane = new JScrollPane( textPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) { @Override public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.width = 100; return d; @Override public Dimension getMinimumSize() { return super.getPreferredSize(); } }; }} **解説 [#fffdaf9e] - ``JScrollPane``に追加 -- ``JScrollBar``を常に非表示にした、``JScrollPane``に``JTextPane``を追加 - JTextPaneの折り返しを無効化 -- [http://www.java2s.com/Code/Java/Swing-JFC/NonWrappingWrapTextPane.htm Non Wrapping(Wrap) TextPane : TextField « Swing JFC « Java]を参考に、``JTextPane#getScrollableTracksViewportWidth()``をオーバーライドして、折り返しを無効化 -- メモ: [[JEditorPaneで長い行を折り返さない>Swing/NoWrapTextPane]] -- %% [http://www.java2s.com/Code/Java/Swing-JFC/NonWrappingWrapTextPane.htm Non Wrapping(Wrap) TextPane : TextField « Swing JFC « Java]を参考に、``JTextPane#getScrollableTracksViewportWidth()``をオーバーライドして、折り返しを無効化%% -- [[JEditorPaneで長い行を折り返さない>Swing/NoWrapTextPane]]の``ParagraphView``を使用して、折り返しを無効化 - 文字列の最後にある``Caret``が表示されないのを修正 -- ``JTextPane#scrollRectToVisible(Rectangle)``をオーバーライドして、余白までスクロールするように設定 -- メモ: [http://tips4java.wordpress.com/2009/01/25/no-wrap-text-pane/ No Wrap Text Pane ≪ Java Tips Weblog]のように、``CaretListener``を使用する方法もある - 改行キーの無効化 -- ``JTextPane``から``InputMap``を取得して、``KeyEvent.VK_ENTER``をなにもしない``Action``で置き換える -- ``Document#insertString(...)``をオーバーライドして、コピー・ペーストなどで張り込まれた文字列から、改行を空白に置換 - タブキーでフォーカス移動 -- [[FocusTraversalKeysに矢印キーを追加してフォーカス移動>Swing/FocusTraversalKeys]] -- ``JTextPane``から``InputMap``を取得して、``KeyEvent.VK_TAB``をなにもしない``Action``で置き換え、``JTextPane#setFocusTraversalKeys(...)``で、タブキーでフォーカス移動するように設定 - 文字スタイルの変更 -- [http://www.discoverteenergy.com/files/SyntaxDocument.java SyntaxDocument.java]を使って、入力された``red``, ``green``, ``blue``の文字色を変更 **参考リンク [#ab80be9a] - [http://www.java2s.com/Code/Java/Swing-JFC/NonWrappingWrapTextPane.htm Non Wrapping(Wrap) TextPane : TextField « Swing JFC « Java] - [[JEditorPaneで長い行を折り返さない>Swing/NoWrapTextPane]] //- [http://www.java2s.com/Code/Java/Swing-JFC/NonWrappingWrapTextPane.htm Non Wrapping(Wrap) TextPane : TextField « Swing JFC « Java] - [[FocusTraversalKeysに矢印キーを追加してフォーカス移動>Swing/FocusTraversalKeys]] **コメント [#y0a07202] - ``JTextField``では、"aaaaa|bbbbb"でカーソル``|``の位置に文字を追加していくと領域外にカーソルが移動した時点で``bbbbb``が表示されるようにスクロールするが、ここの``OneLineTextPane``では未対応。 -- [[aterai]] &new{2013-05-06 (月) 15:35:00}; #comment