Numerador de líneas

mramirezc84
23 de Marzo del 2005
hola a todos!
tengo un código para implementar un numerador de líneas como el de los editores de código (ej, JCreator) y que quiero aplicar a un JTextPane, funciona bien siempre y cuando no cambie el tamaño de la fuente, les paso el código por si a alguien le sirve y si alguien lo puede perfeccionar, que me lo pueda enviar, porfa. el problema es que utilizo una fuente y tamaño del numerador por default y no he tenido mucho tiempo para corregirlo y hacer que verifique la fuente del textPane y se ajuste a ella.

se utiliza asi:

NumeradorLineas numerador = new NumeradorLineas( myJTextPane );

y el código es el siguiente:

class NumeradorLineas extends JComponent {
private final static Color DEFAULT_BACKGROUND = new Color( 153, 153, 204 );
private final static Color DEFAULT_FOREGROUND = new Color( 0, 0, 128 );
private final static Font DEFAULT_FONT = new Font("Dialog",Font.ITALIC,16);
private final static int HEIGHT = Integer.MAX_VALUE - 800000;
private final static int MARGIN = 3;
private FontMetrics fontMetrics;
private int altoDeLinea;
private int currentRowWidth;
private JComponent component;
private int componentFontHeight;
private int componentFontAscent;

public NumeradorLineas (JComponent component)
{
if (component == null)
{
setBackground(DEFAULT_BACKGROUND);
setForeground(DEFAULT_FOREGROUND);
setFont(DEFAULT_FONT);
this.component = this;
}
else
{
setBackground(DEFAULT_BACKGROUND);
//setForeground(component.getForeground());
setForeground(DEFAULT_FOREGROUND);
setFont(component.getFont());
this.component = component;
}
componentFontHeight = component.getFontMetrics(component.getFont()).getHeight();
componentFontAscent = component.getFontMetrics(component.getFont()).getAscent();
setPreferredWidth(9999);
}
public void setPreferredWidth(int row)
{
int width = fontMetrics.stringWidth(String.valueOf(row));
if (currentRowWidth < width)
{
currentRowWidth = width;
setPreferredSize(new Dimension(2*MARGIN+width,HEIGHT));
}
}
public void setFont(Font font)
{
super.setFont(font);
fontMetrics = getFontMetrics(getFont());
}
public int getLineHeight()
{
if (altoDeLinea==0) return componentFontHeight;
else return altoDeLinea;
}
public void setLineHeight(int altoDeLinea) {
if (altoDeLinea > 0) this.altoDeLinea=altoDeLinea;
}
public int getStartOffset() {
return component.getInsets().top + componentFontAscent;
}
public void paintComponent(Graphics g) {
int altoDeLinea = getLineHeight();
int startOffset = getStartOffset();
Rectangle rectangulo = g.getClipBounds();
g.setColor( getBackground() );
g.fillRect(rectangulo.x, rectangulo.y, rectangulo.width, rectangulo.height);
g.setColor( getForeground() );
int startLineNumber = (rectangulo.y / altoDeLinea) + 1;
int endLineNumber = startLineNumber + (rectangulo.height / altoDeLinea);
int start = (rectangulo.y / altoDeLinea) * altoDeLinea + startOffset;
for (int i = startLineNumber; i <= endLineNumber; i++) {
String lineNumber = String.valueOf(i);
int width = fontMetrics.stringWidth( lineNumber );
g.drawString(lineNumber, MARGIN + currentRowWidth - width, start);
start += altoDeLinea;
}
setPreferredWidth( 20 );
}
}

mramirezc84
23 de Marzo del 2005
perdon, omití unos detalles:

primero se agrega un scroll asi:
JScrollPane myScroll = new JScrollPane(myJTextPane);

//despues se crea el numerador y se pone como vista de filas del scroll
NumeradorLineas numerador = new NumeradorLineas( myJTextPane );
myScroll.setRowHeaderView( numerador );

sorry