Textpositionierung in einer JTextPane

Hi werte Javafreunde im Forum,

ich versuche aktuell ein Rechnungsformular automatisch zu erstellen. Dazu benutze ich
diverse Comboboxen und ein JTextPane. Mir ist bekannt, dass es Alignmentfunktionen gibt,
aber ich denke, da ich die Justierung zeilenbasiert machen möchte und nicht Abschnittsweise
kann ich diese Funktionen nicht anwenden.

Die Idee ist wie folgt:

Adressdaten auf der linken Seite und Bankdaten rechts also ungefähr so:

Firma Bankdaten
Müller Kontonummer
Heizungsbau BLZ
Neue Strasse 3 …
12345 Musterhausen …

Dazu ermittele ich aus meinem Adressstring der über split in ein Array eingelesen wird die Länge des Strings
und vergleiche sie mit einer Standardlänge (einfach per Definition auf 5 gesetzt) - die Standardanzahl von
Spaces ist testweise auf 30 gesetzt.

Nach meiner Ansicht habe ich vier Fälle:

  1. Der String ist größer als 5 - somit müssen die Spaces um die Differenz verringert werden.
  2. Der String ist kleiner als 5 aber größer als 0 - die Spaces müssen um die Differenz vergrößert werden.
  3. Der String ist gleich 5 - Spaces sind auf dem Standardwert 30.
  4. Der String ist kleiner ein Leerstring - der Wert der Spaces ist 35.

Somit müsste ich bei einer monospaced Schrift einen immer gleichen Abstand haben obwohl die Adressstrings ja in der Größe variabel sind.

Hier mal ein Anwendungsbeispiel aus der Praxis danach meine Ausgabe und der Codeabschnitt:

Architekturbüro (15)
Kammerer (8)
Blumenstr.350 (13)
73262 Reichenbach/Fils (22)

Programmermittelte Wert (sind meines Erachtens korrekt):
Das Wort ist größer um 10 Zeichen.
Somit werden 20+ angehängt
Das Wort ist größer um 3 Zeichen.
Somit werden 27+ angehängt
Leerstring.
Somit werden 35 + angehängt
Das Wort ist größer um 7 Zeichen.
Somit werden 23+ angehängt
Das Wort ist größer um 17 Zeichen.
Somit werden 13+ angehängt

Ausgabe in der JTextPane ergibt jedoch:

Architekturbüro0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,Bankverbindungen
Kammerer0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,Kreissparkasse Esslingen
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,KontoNr.10081895
Blumenstr.350,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,BLZ: 61150020
73262 Reichenbach/Fils0,1,2,3,4,5,6,7,8,9,10,11,12,

Die Zahlen stehen zu Testzwecken für die Spaces - wie man sieht ist alles verschoben - was läuft falsch?

Hier der Codeteil:

public void actionPerformed(ActionEvent e)
	{
		
	//Adresse
		if (e.getActionCommand().equals("Adresse speichern")){
			Blatt.setFont( new Font( "Monospaced", Font.PLAIN, 12 ));
			doc = Blatt.getDocument();
			
		    String adresse=cmbAdresse.getSelectedItem().toString();
		    String Bankdaten ="Bankverbindungen//Kreissparkasse Esslingen//KontoNr.10081895//BLZ: 61150020//"+" ";
		    String[] Bank = Bankdaten.split("//");		
	    	String[] anschrift = adresse.split("//");
	    	String Beschreibung = txtBeschreibung.getText();
	    	String[] BV_Beschreibung=Beschreibung.split("//");
	    	int i,k,k_kleiner=0,k_groesser=0;
	    	String spaces="";
	    	
	    

	    	
	    	
	    	
			try {
				for (i=0; i<anschrift.length;i++){
					
					//Firma=5 Zeichen, das ist Standard
					
				if ((anschrift**).length()== 5){
					
					for(k=0;k<30;k++){//30 Spaces
						spaces=spaces +k+",";
						
					                  }
					 System.out.println("Das Wort ist Standargröße es werden 30 + angehängt "+k);
					
					}
					if ((anschrift**).length()==0){
						  for(k=0;k<35;k++){//kleiner
								spaces=spaces +k+",";
							                            }
						    System.out.println("Leerstring.");
						    System.out.println("Somit werden 35 + "+" angehängt");
						    k_kleiner=0;
						
					}
				
					if ((anschrift**).length() < 5 && (anschrift**).length() > 0){
						k_kleiner =(5-(anschrift**).length());
						
					    for(k=0;k<(30+ k_kleiner);k++){//kleiner
							spaces=spaces +k+",";
						                            }
					    System.out.println("Das Wort ist kleiner um " + k_kleiner + " Zeichen.");
					    System.out.println("Somit werden " + (30+k_kleiner) + "+ angehängt");
					    k_kleiner=0;
					}
						
					    if ((anschrift**).length() > 5){
					    	k_groesser =((anschrift**).length()-5);
						    for(k=0;k<(30 - k_groesser);k++){//groesser
								spaces=spaces +k+",";
								}
						    System.out.println("Das Wort ist größer um " + k_groesser + " Zeichen.");
						    System.out.println("Somit werden " + (30-k_groesser) + "+ angehängt");
						    k_groesser=0;
				    }
				  doc.insertString(doc.getLength(),anschrift**.toString()+ spaces + Bank**.toString()+"
",null);
				  spaces="";
			     	}	
									
				}



Sorry wurde ein wenig ausführlich aber ich dachte je mehr Informationen , desto einfach ist es das Problem nachzuvollziehen.

Danke für etwaige Hilfen.

Grüße
Timo

Ich sehe gerade dass das Posting nicht richtig dargestellt wird - die Bankedaten jeweils rechtsbündig und die Adressen linksbündig.

Ich weiß nicht was Du willst, aber Dein Programm scheint ganz normal zu laufen.
Habe Deinen Codeausschnitt hier mal zu einer eigenständigen Anwendung gemacht:

import javax.swing.text.*;
import java.awt.*;

public class Adresse {
  public static void main(String[] args) {

  
    JFrame f = new JFrame("Adresse-Test");
    JTextPane blatt = new JTextPane();
    f.setSize(500,400);
   
     
    
    blatt.setFont( new Font( "Monospaced", Font.PLAIN, 12 ));
    Document doc = blatt.getDocument();


    String adresse="Architekturbüro//Kammerer//Blumenstr.350//73262 Reichenbach/Fils";
    String Bankdaten ="Bankverbindungen//Kreissparkasse Esslingen//KontoNr.10081895//BLZ: 61150020//"+" ";
    String[] Bank = Bankdaten.split("//");     
    String[] anschrift = adresse.split("//");
    String Beschreibung = "dieBeschreibung//und noch eine Beschreibung//und wieder";  //txtBeschreibung.getText();
    String[] BV_Beschreibung=Beschreibung.split("//");
    int i,k,k_kleiner=0,k_groesser=0;
    String spaces="";
    
 
 
 
               
    for (i=0; i<anschrift.length;i++) {
                       
      //Firma=5 Zeichen, das ist Standard
                       
      if ((anschrift**).length()== 5){

        for(k=0;k<30;k++){//30 Spaces
          spaces=spaces +k+",";
        }


        System.out.println("Das Wort ist Standargröße es werden 30 + angehängt "+k);
      }

      if ((anschrift**).length()==0) {
        for(k=0;k<35;k++){//kleiner
          spaces=spaces +k+",";
        }
        System.out.println("Leerstring.");
        System.out.println("Somit werden 35 + "+" angehängt");
        k_kleiner=0;
      }
                   
      if ((anschrift**).length() < 5 && (anschrift**).length() > 0) {
        k_kleiner =(5-(anschrift**).length());

        for(k=0;k<(30+ k_kleiner);k++) {//kleiner
          //spaces=spaces +k+",";
          spaces += " ";
        }
        System.out.println("Das Wort ist kleiner um " + k_kleiner + " Zeichen.");
        System.out.println("Somit werden " + (30+k_kleiner) + "+ angehängt");
        k_kleiner=0;
      }
                           
      if ((anschrift**).length() > 5){
        k_groesser =((anschrift**).length()-5);
        for(k=0;k<(30 - k_groesser);k++){//groesser
          //spaces=spaces +k+",";
          spaces += " ";
        }
        System.out.println("Das Wort ist größer um " + k_groesser + " Zeichen.");
        System.out.println("Somit werden " + (30-k_groesser) + "+ angehängt");
        k_groesser=0;
      }
      try {
        doc.insertString(doc.getLength(),anschrift**.toString()+ spaces + Bank**.toString()+"
",null);
      } catch (BadLocationException e) {
        System.out.println("**Error: " + e);
      }
      spaces="";  
    }
    
    
    f.add(blatt);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}```

Läuft genau so, wie Du es beschrieben hattest, wie es laufen sollte.


Und btw: Nach der Java-Naming-Convention beginnen Variablennamen wie "blatt" mit einem Buchstaben, der klein geschrieben wird.

Grüße
theuserbl

Hi,

vielen Dank für Dein Beispiel -
ich habe nun mein Code soweit abgeändert dass ich Dein

spaces += " ";

übernommen habe - jetz scheint es zu funktionieren!

Vielen Dank
Einen schönen Sonntag noch
Timo