TableTextArea [Java]

Ne Freundin von mir wollte ihre Daten nicht in einer gewöhnlichen Tabelle, sondern in Tabellenform in einer JTextArea darstellen. Hab dazu mal schnell was zusammengeschustert. Ist nicht schön und geht sicherlich besser, aber es tut ihren Zweck. Evtl. kanns ja jemand nochmal gebrauchen, lässt sich auch ziemlich leicht zur Tabellengestaltung auf der Konsole verwenden.


import java.awt.Color;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class TableTextArea extends JTextArea {

	private static final long serialVersionUID = 1L;
	
	private int columnSpace = 2;
	private boolean drawColumnEnd = false;
	
	private String text = "";
	private String noFormatLineStart = "[noform]";
	private String nextColumnString = "	";
	
	public TableTextArea() {
		
		setFont(new Font("monospaced", Font.PLAIN, 12));
		setEditable(false);
		setBackground(new Color(230, 230, 230));
	}
	
	public void format() {
		
		String[] lines = text.split("
");
		super.setText("");
		int[] space = getColumnSpace(lines);
		String[] temp = null;
		for (String str : lines) {
			if (str.startsWith(getNoFormatLineStart())) {
				super.append( str.substring(getNoFormatLineStart().length()));
			}
			else {
				temp = str.split(getNextColumnString());
				for (int i = 0; i < temp.length; i++) {
					while (temp**.length() < space** + columnSpace) {
						temp** += " ";
					}
					super.append(temp**);
					if (isDrawColumnEnd()) {
						super.append("|");
					}
				}
			}
			super.append("
");
		}
	}
	
	public void append(String text) {
		this.text += text;
		format();
	}
	
	public void addRow(String text) {
		if (!this.text.equals("")) {
			this.text += "
";
		}
		this.text += text;
		format();
	}
	
	public void addColumn(String text) {
		this.text += getNextColumnString() + text;
		format();
	}
	
	public void addNoFormatRow(String text) {
		addRow(getNoFormatLineStart() + text);
	}
	
	public int[] getColumnSpace(String[] lines) {
		
		int max = 0;
		int temp = 0;
		String tempStr[] = null;
		for (String str : lines) {
			if (!str.startsWith(getNoFormatLineStart())) {
				temp = str.split(getNextColumnString()).length;
				if (temp > max) {
					max = temp;
				}
			}
		}
		int[] space = new int[max];
		for (String str : lines) {
			if (!str.startsWith(getNoFormatLineStart())) {
				tempStr = str.split(getNextColumnString());
				for (int i = 0; i < tempStr.length; i++) {
					if (space** < tempStr**.length()) {
						space** = tempStr**.length();
					}
				}
			}
		}
		return space;
	}
	
	public String getNextColumnString() {
		return nextColumnString;
	}

	public void setNextColumnString(String nextColumnString) {
		text = text.replaceAll(this.nextColumnString, nextColumnString);
		this.nextColumnString = nextColumnString;
	}

	public String getNoFormatLineStart() {
		return noFormatLineStart;
	}

	public void setNoFormatLineStart(String noFormatLineStart) {
		text = text.replaceAll(this.noFormatLineStart, noFormatLineStart);
		this.noFormatLineStart = noFormatLineStart;
	}

	public void setText(String text) {
		this.text = text;
		format();
	}
	
	public String getText() {
		return text;
	}

	public String getFormatText() {
		return super.getText();
	}
	
	public int getColumnSpace() {
		return columnSpace;
	}

	public void setColumnSpace(int columnSpace) {
		this.columnSpace = columnSpace;
	}

	public boolean isDrawColumnEnd() {
		return drawColumnEnd;
	}

	public void setDrawColumnEnd(boolean drawColumnEnd) {
		this.drawColumnEnd = drawColumnEnd;
	}	
	
	public static void main(String[] args) {
		
		JFrame frame = new JFrame();
		TableTextArea tta = new TableTextArea();
		tta.addNoFormatRow("Überschrift - solche Zeilen werden nicht berücksichtigt");
		tta.addNoFormatRow("");
		tta.addRow("Zeile 1");
		tta.addColumn("Spalte 2 in Zeile 1");
		tta.addColumn("Spalte 3");
		tta.addRow("Zeile 2 in Spalte 1");
		tta.addColumn("Spalte 2");
		tta.addRow("Zeile 3");
		tta.addColumn("Spalte 2");
		tta.addColumn("Spalte 3 in Zeile 3");
		frame.add(new JScrollPane(tta));
		frame.setSize(500, 300);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}```

Ausführbar zur kurzen Demonstation.