• category: swing folder: MouseOverPainter title: JTextAreaの行をマウスでロールオーバー表示 tags: [JTextArea, MouseListener, MouseMotionListener] author: aterai pubdate: 2006-09-25 pubdate: 2006-09-25T03:59:45+09:00 description: JTextAreaのマウスカーソルがある行をロールオーバー表示します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTQFUVNyQI/AAAAAAAAAfA/cTsyoFPSNEg/s800/MouseOverPainter.png

概要

概要

JTextAreaのマウスカーソルがある行をロールオーバー表示します。

サンプルコード

サンプルコード

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);
  }
#spanadd

#spanend
  @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 MouseInputAdapter {
#spanadd

#spanend
  private class RollOverListener extends MouseAdapter {
    @Override public void mouseExited(MouseEvent e) {
      rollOverRowIndex = -1;
      repaint();
    }
#spanadd

#spanend
    @Override public void mouseMoved(MouseEvent e) {
      int row = getLineAtPoint(e.getPoint());
      if (row != rollOverRowIndex) {
        rollOverRowIndex = row;
        repaint();
      }
    }
#spanadd

#spanend
    public int getLineAtPoint(Point pt) {
      Element root = getDocument().getDefaultRootElement();
      return root.getElementIndex(viewToModel(pt));
    }
  }
}
View in GitHub: Java, Kotlin

解説

MouseInputAdapterを継承したRollOverListenerで、マウスカーソルのある行を記憶し、JTextArea#paintComponentメソッドをオーバーライドして、その行の背景に色を付けています。

解説

  • MouseAdapterを継承したRollOverListenerでマウスカーソルのある行を記憶
  • JTextArea#paintComponentメソッドをオーバーライドしてその行の背景色を変更

コメント

参考リンク

コメント