Swing/MouseOverPainter のバックアップの現在との差分(No.10)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/MouseOverPainter へ行く。
- 1 (2007-08-22 (水) 11:02:35)
- 2 (2011-05-05 (木) 08:26:33)
- 3 (2013-02-23 (土) 23:15:12)
- 4 (2014-11-22 (土) 03:59:58)
- 5 (2015-02-02 (月) 17:44:25)
- 6 (2015-04-04 (土) 22:09:44)
- 7 (2016-03-25 (金) 21:27:54)
- 8 (2016-09-18 (日) 21:06:07)
- 9 (2017-10-31 (火) 14:13:28)
- 10 (2019-04-25 (木) 17:37:01)
- 11 (2021-02-04 (木) 01:44:10)
- 12 (2024-03-22 (金) 16:22:14)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: MouseOverPainter title: JTextAreaの行をマウスでロールオーバー表示 tags: [JTextArea, MouseListener, MouseMotionListener] author: aterai pubdate: 2006-09-25T03:59:45+09:00 description: JTextAreaのマウスカーソルがある行をロールオーバー表示します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTQFUVNyQI/AAAAAAAAAfA/cTsyoFPSNEg/s800/MouseOverPainter.png --- * 概要 [#summary] `JTextArea`のマウスカーソルがある行をロールオーバー表示します。 #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTQFUVNyQI/AAAAAAAAAfA/cTsyoFPSNEg/s800/MouseOverPainter.png) * サンプルコード [#sourcecode] #code(link){{ class HighlightCursorTextArea extends JTextArea { private static final Color LINE_COLOR = new Color(250, 250, 220); private int rollOverRowIndex = -1; private MouseAdapter rolloverHandler; @Override public void updateUI() { removeMouseMotionListener(rolloverHandler); removeMouseListener(rolloverHandler); super.updateUI(); setOpaque(false); setBackground(new Color(0x0, true)); // Nimbus rolloverHandler = new RollOverListener(); addMouseMotionListener(rolloverHandler); addMouseListener(rolloverHandler); } @Override protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g.create(); Insets i = getInsets(); int h = g2.getFontMetrics().getHeight(); int y = rollOverRowIndex * h + i.top; g2.setPaint(LINE_COLOR); g2.fillRect(i.left, y, getSize().width - i.left - i.right, h); g2.dispose(); super.paintComponent(g); } private class RollOverListener extends MouseAdapter { @Override public void mouseExited(MouseEvent e) { rollOverRowIndex = -1; repaint(); } @Override public void mouseMoved(MouseEvent e) { int row = getLineAtPoint(e.getPoint()); if (row != rollOverRowIndex) { rollOverRowIndex = row; repaint(); } } public int getLineAtPoint(Point pt) { Element root = getDocument().getDefaultRootElement(); return root.getElementIndex(viewToModel(pt)); } } } }} * 解説 [#explanation] `MouseAdapter`を継承した`RollOverListener`で、マウスカーソルのある行を記憶し、`JTextArea#paintComponent`メソッドをオーバーライドして、その行の背景に色を付けています。 - `MouseAdapter`を継承した`RollOverListener`でマウスカーソルのある行を記憶 - `JTextArea#paintComponent`メソッドをオーバーライドしてその行の背景色を変更 * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/text/Element.html#getElementIndex-int- Element#getElementIndex(...) (Java Platform SE 8)] * コメント [#comment] #comment #comment