# Zeilennummer anzeigen



## Michael167 (21. Apr 2008)

Hallo,

ich habe eine jTextPane und möchte daneben in einer JTextArea immer die aktuelle Zeilennummern stehen haben


```
StringBuffer lines = new StringBuffer();

	public JComponent createZeilennummern(){
		
		JScrollPane jScrollPane = new JScrollPane();
		JTextPane jCurrentTextPane = new JTextPane();
			
		JPanel numbersAndText = new JPanel();
	        JTextArea lineNumbers = new JTextArea();
		
                getLineNumbers();
		numbersAndText.add(jCurrentTextPane);
		numbersAndText.add(lineNumbers);
		    
		jScrollPane.setRowHeaderView(lineNumbers);
		jScrollPane.setViewportView(jCurrentTextPane);
	        

		return jScrollPane;
	}

       public StringBuffer getlineNumbers(){
	    lines.append(1 + "  \n");
	    lines.append(2 + "  \n");
	    
	    return lines;
	}
```


jetzt ist mein problem, dass ich nicht weiß wie ich immer die aktuelle Zeilennummer bekomme (wenn man text in JTextPane schreibt) und dann gleich in der JTextArea anzeige

vll kann mir jemand helfen

Danke,
Michael[/code]


----------



## The_S (21. Apr 2008)

Hier mal eine 1zu1 Kopie aus einem Projekt von mir. Dieses JPanel macht genau soetwas was du möchtest, musst es nur noch nach deinen wünschen modifizieren  . Den BFMarker kannst du komplett weglassen und anstelle vom CCPTextArea kannst du auch ein normales JTextArea verwenden.


```
public class BFEditor extends JPanel {

	private static final long serialVersionUID = 1L;
	
	private JPanel master = null;
	private JPanel left = null;
	
	private CCPTextArea editor = null;
	private JTextArea lines = null;
	
	private JScrollPane scroll1 = null;
	private JScrollPane scroll2 = null;
	
	private BFMarker marker = null;
	
	private Font font = null;
	
	public BFEditor() {
		
		master = new JPanel();
		left = new JPanel();
		editor = new CCPTextArea();
		lines = new JTextArea("1");
		
		marker = new BFMarker();
		
		scroll1 = new JScrollPane(editor, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		scroll2 = new JScrollPane(left, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		
		font = new Font("monospaced", Font.PLAIN, 12);
		
		lines.setEditable(false);
		lines.setFont(font);
		editor.setFont(font);
		marker.setLineHeight(editor.getFontMetrics(editor.getFont()).getHeight());

		editor.getDocument().addDocumentListener(new DocumentListener() {

			public void changedUpdate(DocumentEvent arg0) {
				updateLines();
			}

			public void insertUpdate(DocumentEvent arg0) {
				updateLines();
			}

			public void removeUpdate(DocumentEvent arg0) {
				updateLines();
			}
		});
		
		scroll1.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {

			public void adjustmentValueChanged(AdjustmentEvent evt) {
				scroll2.getVerticalScrollBar().setValue(scroll1.getVerticalScrollBar().getValue());
			}
		});
		
		setLayout(new BorderLayout());
		master.setLayout(new BorderLayout());
		left.setLayout(new BorderLayout());
		
		master.add(scroll2, BorderLayout.WEST);
		master.add(scroll1);
		
		left.add(marker, BorderLayout.WEST);
		left.add(lines);
		
		add(master);
		
		updateLines();
	}
	
	public void setEditable(boolean editable) {
		editor.setEditable(editable);
	}
	
	public void setPos(int pos) {
		editor.setSelectionStart(pos);
		editor.setSelectionEnd(pos + 1);
		editor.requestFocusInWindow();
	}
	
	public void setText(String text) {
		editor.setText(text);
	}
	
	public String getText() {
		return editor.getText();
	}
	
	public ArrayList<BreakPoint> getBreakPoints() {
		return marker.getPoints();
	}
	
	private void updateLines() {
		
		StringBuilder build = new StringBuilder();
		String text = editor.getText();
		int lines = 0;
		for (int i = 0, j = 1; i != -1; j++) {
			lines++;
			i = text.indexOf("\n", i);
			build.append(j + "\n");
			if (i != -1) {
				i++;
			}
		}
		if (build.length() != this.lines.getText().length()) {
			marker.setLines(lines);
			marker.repaint();
			this.lines.setText(build.toString());
			scroll2.setPreferredSize(new Dimension(this.lines.getFontMetrics(font).stringWidth(lines + " ") + 15, 0));
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					scroll2.getVerticalScrollBar().setValue(scroll1.getVerticalScrollBar().getValue());
					validate();
				}
			});
		}
	}
}
```


----------



## Michael167 (21. Apr 2008)

Danke für deine Hilfe, ich habe leider noch Probleme mit dem DocumentListener

habe jetzt mal: 
	
	
	
	





```
public class BFEditor extends JFrame implements DocumentListener{
```

...aber das funktioniert irgendwie nicht, vielleicht kannst du mir noch einmal helfen



lg
Michael


----------



## The_S (21. Apr 2008)

Den DocumentListener musst du doch nicht noch extra implementieren, wird doch schon als anonyme, innere Instanz angelegt.


----------



## Michael167 (21. Apr 2008)

```
editor.getDocument().addDocumentListener(new DocumentListener() {
```


ich bekomme jedoch hier eine Fehlermeldung:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	DocumentListener cannot be resolved to a type


----------



## The_S (21. Apr 2008)

Dann musst du den DocumentListener noch importieren (so wie alle anderen Klassen auch, die nicht in java.lang sind) ...


----------



## Michael167 (21. Apr 2008)

danke, ich hatte nur awt event importiert

import java.awt.event.*;


----------



## Guest (28. Apr 2008)

Hier ist noch ein anderer Ansatz: http://www.java-forum.org/de/viewtopic.php?t=23257


----------

