SWT Zeilennummernanzeige

Hallo Leute,

ich möchte einen Texteditor machen bei dem auf der linken Seite die Zeilennummern angezeigt werden.
Nun habe ich es schon soweit hinbekommen, dass wenn ich ziemlich oft Enter drücke, links die Zeilen mitfahren...das Problem ist nun, wenn ich wieder hinaufscrolle, fahren die Zeilennummern nicht zurück.

Hier der Code:
Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Testklasse {
	Display display;
	Shell shell;
	StyledText text;
	public Testklasse(){
		display = new Display();
		shell = new Shell(display);
		shell.setText("Shell");
		shell.setLayout(new BorderLayoutMain(10));
		final StyledText l = new StyledText(shell, SWT.MULTI|SWT.BORDER);
		l.setText("1");
		l.setEnabled(false);
		l.setEditable(false);
		l.setLayoutData(new BorderLayoutMain.BorderDataMain(BorderLayoutMain.WEST));
		Font font = new Font(shell.getDisplay(), "Courier New", 10, SWT.NORMAL);
		text = new StyledText(shell, SWT.MULTI|SWT.BORDER|SWT.V_SCROLL);
		text.setFont(font);
		Font font1 = new Font(shell.getDisplay(), "Courier New", 10, SWT.NORMAL);
		l.setFont(font1);
		l.setBackground(display.getSystemColor(SWT.COLOR_GRAY));
		text.setLayoutData(new BorderLayoutMain.BorderDataMain(BorderLayoutMain.CENTER));
		text.addVerifyListener(new VerifyListener(){
			public void verifyText(VerifyEvent arg0) {
				String lines="";
				for(int i=1;i<=text.getLineCount()+1;i++){
					lines=lines+(i)+"\n";
				}
				l.setText(lines.substring(0,lines.length()-1));
				int k=l.getContent().getLineCount();
				l.setTopPixel(k*17);
			}
		});		
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}
	public static void main(String[] args) {
		new Testklasse();
	}
}

l.setTopPixel(k*17); damit scrolle ich hinunter, das *17 ist die Höhe der Zeile, also 17 Pixel.

Weiß jemand eine bessere Lösung?? Oder was ich verbessern kann bzw. tun kann damit es funktioniert??

Danke im Vorraus
EanstKristoffa
 

Wildcard

Top Contributor
Verwende doch Eclipse RCP statt purem SWT. Dort gibt es unter anderem einen AbstractTextEditor der bereits sehr viele Features bietet, damit sparst du dir viel Arbeit.
 
Mhh wo isn da der Unterschied? JFace vs. SWT???

Aber im Prinzip will ich ja nur wissen wie ich in einem StyledText Feld die aktuelle Zeile in der ich mich befinde bekomme!!!!
 

Wildcard

Top Contributor
SWT ist eine Low-Level Widget Bibliothek. JFace sitzt auf SWT und bringt OOP und mächtigere Widget Kompositionen ins Spiel. JFace macht SWT eigentlich erst benutzbar.
Der JFace SourceViewer (die Basis für alle Eclipse Text Editoren, also auch den Java Editor) kann zB out-of-the-box Zeilennummern an der Seite anzeigen. Der SourceViewer basiert übrigens auf einem StyledText, aber du musst dich nicht mehr mit den Details herumschlagen.
 
Mhh keine Ahnung, ich hab mir bissl was angeschaut aber versteh absolut garnichts. Da bleib ich lieber bei nur SWT und würd gern noch immer wissen wie man das oben genannte macht.
 
So hier die Antwort auf meine Frage...schon lustig dass der Threadsteller hier seine Fragen selbst beantworten muss:
Java:
text.addKeyListener(new KeyListener(){
   public void keyPressed(KeyEvent arg0) { 
    String lines="";
    for(int i=1;i<=text.getLineCount();i++){
     lines=lines+i+"\n";
    }
    l.setText(lines.substring(0,lines.length()-1));
    l.setTopPixel((text.getCaretOffset()/2)*17);
   }
   public void keyReleased(KeyEvent arg0) {
   }
  });
 

Antoras

Top Contributor
schon lustig dass der Threadsteller hier seine Fragen selbst beantworten muss:
Man lernt am meisten wenn man eine Lösung selbst findet und nicht immer nur andere um Hilfe fragt...

Im übrigen ist deine Lösung mit String-concatenation schlecht, da Strings unveränderlich sind. D.h. bei jeder concatenation wird ein neuer String kreiert. Verwende lieber einen StringBuilder, das ist deutlich effizienter.
Momentan sieht es auch so aus, wie wenn die Zeilennummern mit dem Text zusammen stehen. Ich hab zwar keine Ahnung von SWT, aber es dürfte sinnvoll sein, die Zeilennummern in einer separaten Komponente zu speichern und diese einfach an der Seite neben dem Text anzuzeigen. Momentan berechnest du die Zeilennummern ja mehrfach, genau genommen bei jedem Tastendruck. Das ist auch uneffizient.

Vllt. wäre es wirklich besser, dass du dir JFace mal anschaust, wenn es so mächtig ist wie Wildcard gesagt hat. Damit dürftest du dann wahrscheinlich viele deiner Probleme umgehen mit denen du dich jetzt hier herumschlägst.
 

Wildcard

Top Contributor
Der SourceViewer bringt Support für Ruler mit. Einer dieser Ruler kann zB Annotations (Warnings, Errors) und eben auch Zeilennummern anzeigen.
Wenn du das nicht verwenden möchtest, musst du dein Problem tatsächlich alleine lösen, oder auf andere Antworten warten, denn ich habe wenig interesse daran Zeit dabei zu verschwenden das Rad neu erfinden zu wollen.
 

Neue Themen


Oben