Tabulator in JTextPane

Hallo,

ich wollte in einem JTextPane die TabStops setzen, so weit wie ich es mir dachte, geht das so:

TabSet tabSet = new TabSet(new TabStop[] {new TabStop(4,TabStop.ALIGN_RIGHT,TabStop.LEAD_DOTS)
                                         ,new TabStop(8,TabStop.ALIGN_DECIMAL,TabStop.LEAD_HYPHENS)
                                         ,new TabStop(12,TabStop.ALIGN_DECIMAL,TabStop.LEAD_HYPHENS)
                                                 } );

SimpleAttributeSet set = new SimpleAttributeSet();
StyleConstants.setTabSet(set, tabSet);

Aber leider funktioniert das nicht.

4 Pixel ist etwas knapp als Tabstop.
Ansonsten seh ich in deinem Code keine offensichtlichen Fehler.
Vielleicht solltest du noch ein wenig mehr Code posten, damit wir den Zusammenhang sehen.
Und bitte sag uns dann auch gleich, was genau nicht funktioniert,
bzw. wie dein Programm genau reagiert und wie du willst, daß es reagieren sollte.
Danke für die Mühe :wink:

Naja, im Augenblick ist es so, das bei mir der Tab 10 Zeichen (keine Pixel) weiter geht , ich möchte es aber gern z.b. auf nur 4 Zeichen einstellen.
Der andere Code hat mit dem Tab-Abstand nichts weiter zu tun. ich bastele halt an einem Editor, und mal sehen , vll wird ja mal eine IDE drauss :slight_smile:

Der Style muss sich offenbar auf den Paragraph, nicht auf einzelne Textelemente beziehen. Dafür kann man die Methode “setLogicalStyle” verwenden. Ob man das global für alle Paragraphen setzen kann, weiss ich nicht.


import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.TabSet;
import javax.swing.text.TabStop;

public class Test {
    public static void main( String[] args ) throws Exception{
    	for( int t = 1; t < 4; t++ ){
	    	TabSet set = new TabSet( new TabStop[]{
	    		   new TabStop( t*100, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE ),
	    		   new TabStop( t*200, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE ),
	    		   new TabStop( t*300, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE ),
	    	});
	    	
	    	DefaultStyledDocument doc = new DefaultStyledDocument();
	    	Style style = doc.addStyle( "root", null );
	    	StyleConstants.setTabSet( style, set );
	    	
	    	doc.insertString( 0, "Hallo	du	da
0	1	2	3
", null );
	    	doc.setLogicalStyle( 0, style );
	    	doc.setLogicalStyle( "Hallo	du	da
".length(), style );
	    	
	    	JTextPane pane = new JTextPane( doc );
	    	
	    	JFrame frame = new JFrame( "Dist: " + t );
	    	frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	    	frame.add( new JScrollPane( pane ) );
	    	frame.setBounds( t*20, t*20, 800, 200 );
	    	frame.setVisible( true );
    	}
    }
}```

[EDIT]
Es geht noch einfacher:
```	    	doc.insertString( 0, "Hallo	du	da
0	1	2	3
", null );
	    	//doc.setLogicalStyle( 0, style );
	    	//doc.setLogicalStyle( "Hallo	du	da
".length(), style );
	    	doc.setParagraphAttributes( 0, doc.getLength(), style, false );
	    	
	    	JTextPane pane = new JTextPane( doc );```

Wenn die Schrift nicht von der Art von „Monospaced“ ist, dann ist die Zeichenbreite variabel und du weisst nicht, wie weit du für 4 Zeichen springen musst :wink:

Rein zufällig, wie es die Sache will , ist es Monospaced :wink: und noch ergänzend zum Beni,

TabStop[] tabStops = new TabStop[200];

for(int pos = 0; pos < tabStops.length; pos++) 
{
            tabStops[pos] = new TabStop(pos * 32,TabStop.ALIGN_LEFT,TabStop.LEAD_NONE);
}
TabSet tabSet = new TabSet(tabStops);

JTextPane editor = new JTextPane();

SimpleAttributeSet set = new SimpleAttributeSet();
StyleConstants.setTabSet(set, tabSet);
editor.setParagraphAttributes(set,true);

so kann man auch für das ganze Document setzen, und muß nicht vorher wissen, von wo bis wo. Etwas allgemeiner halt. Ganz Praktisch, um das Document voreinzustellen.

Also hatte dein „anderer Code“ doch mehr mit der Sache zu tun,
als du anfangs glaubtest.
Erfahrungsgemäss ist das fast immer so bei Problemen,
wo nur der vermeintlich „schuldige“ Codeteil gepostet wird :wink:

Naja, den restlichen Code zu posten , ich glaube das wäre etwas übertrieben gewesen, weil das wären ca 200 Zeilen gewesen. Aber wenn Du noch mal beschreiben kannst, wofür setLogicalStyle , setCharackterAttributes und setParagraphAttributes gut sind und wie was alles zusammen arbeitet, wäre ich Dir sehr dankbar.

Naja, den restlichen Code zu posten , ich glaube das wäre etwas übertrieben gewesen,
weil das wären ca 200 Zeilen gewesen.
Schonmal was von „Kurzes, Selbständiges, Kompilierbares Beispiel gehört“ (KSKB) ?
[u]Lies mich[/u]

wenn Du noch mal beschreiben kannst, wofür setLogicalStyle , setCharackterAttributes
und setParagraphAttributes gut sind
Mehr als in der API steht, kann ich dir leider nicht dazu sagen (mit Styles arbeite ich eh nicht so besonders viel).
Wenn du aber einen Editor schreiben willst, dann würde ich dir empfehlen, dir diesen einmal anzuschauen:
…\jdk1.x.x_xx\demo\jfc\Stylepad