public void paintComponent(Graphics g) { int lineHeight = getLineHeight(); int startOffset = getStartOffset(); Rectangle drawHere = g.getClipBounds(); // Paint the background g.setColor( getBackground() ); g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height); // Determine the number of lines to draw in the foreground. g.setColor( getForeground() ); int startLineNumber = (drawHere.y / lineHeight) + 1; int endLineNumber = startLineNumber + (drawHere.height / lineHeight); int start = (drawHere.y / lineHeight) * lineHeight + startOffset; for (int i = startLineNumber; i <= endLineNumber; i++) { String lineNumber = String.valueOf(i); int stringWidth = fontMetrics.stringWidth( lineNumber ); int rowWidth = getSize().width; g.drawString(lineNumber, rowWidth - stringWidth - MARGIN, start); start += lineHeight; } int rows = component.getSize().height / componentFontHeight; setPreferredWidth( rows ); }
/** * Reset variables that are dependent on the font. */ public void setFont(Font font) { super.setFont(font); fontMetrics = getFontMetrics( getFont() ); componentFontHeight = fontMetrics.getHeight(); componentFontAscent = fontMetrics.getAscent(); }
/** * Calculate the width needed to display the maximum line number */ public void setPreferredWidth(int lines) { int digits = String.valueOf(lines).length(); // Update sizes when number of digits in the line number changes if (digits != currentDigits && digits > 1) { currentDigits = digits; int width = fontMetrics.charWidth( '0' ) * digits; Dimension d = getPreferredSize(); d.setSize(2 * MARGIN + width, HEIGHT); setPreferredSize( d ); setSize( d ); } }
/** * Convenience constructor for Text Components */ public LineNumber(JComponent component) { if (component == null) { setFont( DEFAULT_FONT ); this.component = this; } else { setFont( component.getFont() ); this.component = component; } setBackground( DEFAULT_BACKGROUND ); setForeground( DEFAULT_FOREGROUND ); setPreferredWidth( 99 ); }
public static void main(String[] args) { JFrame frame = new JFrame("LineNumberDemo"); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); JPanel panel = new JPanel(); frame.setContentPane( panel ); panel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); panel.setLayout(new BorderLayout()); JTextPane textPane = new JTextPane(); textPane.setFont( new Font("monospaced", Font.PLAIN, 12) ); textPane.setText("abc"); JScrollPane scrollPane = new JScrollPane(textPane); panel.add(scrollPane); scrollPane.setPreferredSize(new Dimension(300, 250)); LineNumber lineNumber = new LineNumber( textPane ); scrollPane.setRowHeaderView( lineNumber ); frame.pack(); frame.setVisible(true); } }
/** * Convenience constructor for Text Components */ public LineNumber(JComponent component) { if (component == null) { setFont( DEFAULT_FONT ); this.component = this; } else { setFont( component.getFont() ); this.component = component; } setBackground( DEFAULT_BACKGROUND ); setForeground( DEFAULT_FOREGROUND ); setPreferredWidth( 99 ); }
public static void main(String[] args) { JFrame frame = new JFrame("LineNumberDemo"); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); JPanel panel = new JPanel(); frame.setContentPane( panel ); panel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); panel.setLayout(new BorderLayout()); JTextPane textPane = new JTextPane(); textPane.setFont( new Font("monospaced", Font.PLAIN, 12) ); textPane.setText("abc"); JScrollPane scrollPane = new JScrollPane(textPane); panel.add(scrollPane); scrollPane.setPreferredSize(new Dimension(300, 250)); LineNumber lineNumber = new LineNumber( textPane ); scrollPane.setRowHeaderView( lineNumber ); frame.pack(); frame.setVisible(true); } }
public void paintComponent(Graphics g) { int lineHeight = getLineHeight(); int startOffset = getStartOffset(); Rectangle drawHere = g.getClipBounds(); // Paint the background g.setColor( getBackground() ); g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height); // Determine the number of lines to draw in the foreground. g.setColor( getForeground() ); int startLineNumber = (drawHere.y / lineHeight) + 1; int endLineNumber = startLineNumber + (drawHere.height / lineHeight); int start = (drawHere.y / lineHeight) * lineHeight + startOffset; for (int i = startLineNumber; i <= endLineNumber; i++) { String lineNumber = String.valueOf(i); int stringWidth = fontMetrics.stringWidth( lineNumber ); int rowWidth = getSize().width; g.drawString(lineNumber, rowWidth - stringWidth - MARGIN, start); start += lineHeight; } int rows = component.getSize().height / componentFontHeight; setPreferredWidth( rows ); }
/** * Calculate the width needed to display the maximum line number */ public void setPreferredWidth(int lines) { int digits = String.valueOf(lines).length(); // Update sizes when number of digits in the line number changes if (digits != currentDigits && digits > 1) { currentDigits = digits; int width = fontMetrics.charWidth( '0' ) * digits; Dimension d = getPreferredSize(); d.setSize(2 * MARGIN + width, HEIGHT); setPreferredSize( d ); setSize( d ); } }
/** * Reset variables that are dependent on the font. */ public void setFont(Font font) { super.setFont(font); fontMetrics = getFontMetrics( getFont() ); componentFontHeight = fontMetrics.getHeight(); componentFontAscent = fontMetrics.getAscent(); }
public Component getComponent() { if (_scroller == null) { if (_comp == null) { _comp = createSourcePanel(); } _scroller = new JScrollPane(_comp); LineNumber lineNumber = new LineNumber(_comp); _scroller.setRowHeaderView(lineNumber); _scroller.getVerticalScrollBar().setUnitIncrement(10); } return _scroller; }
public Component getComponent() { if (_scroller == null) { if (_comp == null) { _comp = createSourcePanel(); } _scroller = new JScrollPane(_comp); LineNumber lineNumber = new LineNumber(_comp); _scroller.setRowHeaderView(lineNumber); _scroller.getVerticalScrollBar().setUnitIncrement(10); } return _scroller; }