首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JTextArea 顯示行號元件實作指南

     編輯:Java 相關知識

核心思路

自定義 LineNr extends JPanel 作為行號區,放置於 JScrollPane 左側(BorderLayout.WEST),文本區置於中央。覆寫 paint(Graphics g) 同步繪製行號。

關鍵步驟

  1. 文本區 paint() 結束後呼叫 LineNr.repaint() 觸發行號重繪。
  2. 取得視口可見區域:viewToModel() 轉換為文檔偏移量。
  3. 透過 Document.getDefaultRootElement().getElementIndex() 獲取起訖行號。
  4. 計算字體高度、基線位移,迴圈繪製行號字串。

核心代碼片段

public void paint(Graphics g) {
    super.paint(g);
    int start = pane.viewToModel(scrollPane.getViewport().getViewPosition());
    int end = pane.viewToModel(new Point(
        scrollPane.getViewport().getViewPosition().x + pane.getWidth(),
        scrollPane.getViewport().getViewPosition().y + pane.getHeight()));
    Document doc = pane.getDocument();
    int startLine = doc.getDefaultRootElement().getElementIndex(start) + 1;
    int endLine = doc.getDefaultRootElement().getElementIndex(end) + 1;
    int fontHeight = g.getFontMetrics(pane.getFont()).getHeight();
    int fontDesc = g.getFontMetrics(pane.getFont()).getDescent();
    int y = pane.modelToView(start).y - scrollPane.getViewport().getViewPosition().y + fontHeight - fontDesc;
    for (int line = startLine; line <= endLine; line++, y += fontHeight) {
        g.drawString(Integer.toString(line), 0, y);
    }
}

整合示例

JFrame frame = new JFrame();
LineNr nr = new LineNr();
frame.add(nr, BorderLayout.WEST);
frame.add(nr.scrollPane, BorderLayout.CENTER);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved