Swing Einrücken mehrerer Zeilen per Tab in einem JTextPane/JTextArea

Albertus

Mitglied
Guten Abend

Also, ich stehe vor einem kleinen Problem. Da wir einen Editor für eine bestimmte Programmiersprache nicht plattformunabhängig verwenden können, sind wir daran, eine eigene Lösung zu schreiben )Mein Hintergrundwissen liegt eher in C(++) und Qt Applikationen, aber das Ganze wird jetzt halt in Java realisiert).

Nun zu meinem eigentlichen Problem. Ich verwende ein JTextPane, um darin Code schreiben zu können. Einzelne Zeilen mittels Tab einzurücken ist kein Problem, wenn ich aber mehrere Zeilen selektiere und Tab drücke, ersetzt es die Zeilen durch ein Tab, sprich wie folgt:

Ausgangstext
Code:
Zeile 1
Zeile 2
Zeile 3
Zeile 4

Wenn alle 4 Zeilen markiert und Tab gedrückt wird, sollte es nachher so aussehen:

Code:
<Tab>Zeile 1
<Tab>Zeile 2
<Tab>Zeile 3
<Tab>Zeile 4

Das tut es aber nicht, denn es sieht nur so aus:

Code:
<Tab>

Sprich der Text wird mit einem Tab ersetzt und nicht über mehrere Zeilen gleich eingerückt. Gibt es da eine einfache und vorallem saubere Lösung, ich habe mir mal diesen Code angeschaut, aber dort kann ich über den linken Editorrand haus zurücltaben, sprich nicht sehr sauber:

Indentation not possible in JTextPane?

Würde mich über eine Antwort freuen,

Gruss
 

Helgon

Bekanntes Mitglied
Was mir einfällt wäre einfach den selectedText zwischen speichern, jede Zeile splitten und dann mit vorgesetztem Tab wieder einfügen.. wahrscheinlich nicht ultra performant, aber sollte seinen Zweck erfüllen
 

xehpuk

Top Contributor
Wie in dem Beispiel schon angedeutet, brauchst du eine eigene [JAPI]TextAction[/JAPI]:
Java:
public class IndentAction extends TextAction {
	public static final String NAME = "indent";
	
	public IndentAction() {
		super(NAME);
	}
	
	@Override
	public void actionPerformed(final ActionEvent e) {
		final JTextComponent tc = getTextComponent(e);
		final Action insertTabAction = tc.getActionMap().get(DefaultEditorKit.insertTabAction);
		final int start = tc.getSelectionStart();
		final int end = tc.getSelectionEnd();
		if (start == end) { // keine Selektion
			insertTabAction.actionPerformed(e);
		} else {
			final Document doc = tc.getDocument();
			try {
				final int lastPos = Utilities.getRowStart(tc, start);
				int pos = Utilities.getRowStart(tc, end);
				if (lastPos == pos) { // Selektion nur innerhalb einer Zeile
					insertTabAction.actionPerformed(e);
				} else {
					while (true) { // von unten nach oben einen Tab an den Anfang der zeile einfügen
						doc.insertString(pos, "\t", null);
						if (pos <= lastPos) {
							break;
						}
						pos = Utilities.getRowStart(tc, pos - 1);
					}
				}
			} catch (final BadLocationException e1) {
				e1.printStackTrace();
			}
		}
	}
}
Diese kannst du so an deine Textkomponente binden:
Java:
final JTextPane tp = new JTextPane();
tp.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0) /* Tab */, IndentAction.NAME);
tp.getActionMap().put(IndentAction.NAME, new IndentAction());

Für die Ausrückung dann analog:
Java:
public class OutdentAction extends TextAction {
	public static final String NAME = "outdent";
	
	public OutdentAction() {
		super(NAME);
	}
	
	@Override
	public void actionPerformed(final ActionEvent e) {
		// TODO
	}
}
Java:
final JTextPane tp = new JTextPane();
tp.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK) /* Shift+Tab */, OutdentAction.NAME);
tp.getActionMap().put(OutdentAction.NAME, new OutdentAction());

Ich glaube, wenn man es ganz sauber machen will, steuert man das über ein eigenes [JAPI]DefaultEditorKit[/JAPI]. Da bin ich mir gerade aber unsicher.
 

Albertus

Mitglied
Hi

Okay, vielen Dank. das funktioniert bereits super. Jetzt muss ich nur noch was für die Outdent Funktion schreiben. Das Problem liegt hier darin, dass der Block (vor dem eigentlichen Code) aus Tabs (oder im dümmsten Fall auch Leerzeichen) bestehen kann, sprich ich kann schlecht einfach den ersten Tab rausnehmen (Per Escape Sequenz), bin also noch ein bisschen am tüfteln.

Gruss
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
JAVAnnik JavaFX Inhalt der TreeCell nicht einrücken AWT, Swing, JavaFX & SWT 1
R 3D-Grafik Verwendung mehrerer Texturen AWT, Swing, JavaFX & SWT 1
R Auswahl mehrerer JComboBoxen verknüpfne AWT, Swing, JavaFX & SWT 17
D JavaFX Drag&Drop mehrerer TreeViews oder TableViews AWT, Swing, JavaFX & SWT 1
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
Furtano AWT Skalierung mehrerer Bilder / Histogramme im Fenster AWT, Swing, JavaFX & SWT 4
K richtiges Ausrichten mehrerer Labels AWT, Swing, JavaFX & SWT 3
M Ansätze zur Kombination mehrerer Listener für Interaktion AWT, Swing, JavaFX & SWT 19
U Swing Generierung mehrerer Kreise per MouseListener AWT, Swing, JavaFX & SWT 16
M auslesen mehrerer JComboBoxen funktioniert nicht AWT, Swing, JavaFX & SWT 9
M Swing Selektion mehrerer JToggleButton's in einer Gruppe AWT, Swing, JavaFX & SWT 5
S Swing JTable Auswahl mehrerer Zellen mit STRG+Maus AWT, Swing, JavaFX & SWT 3
G Darstellungsproblem mehrerer Komponenten AWT, Swing, JavaFX & SWT 9
D Überwachung mehrerer Textfelder AWT, Swing, JavaFX & SWT 4
S Aufbau mehrerer verschiedener grafischer Oberflächen AWT, Swing, JavaFX & SWT 2
Encera TableView Zeilen als Spalten im SceneBuilder AWT, Swing, JavaFX & SWT 0
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
missy72 JavaFX TableView Spalte zwischen den Zeilen AWT, Swing, JavaFX & SWT 5
T TableView Zeilen einfärben AWT, Swing, JavaFX & SWT 13
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
S JavaFX JavaFX TableView scrollen färbt falsche Zeilen AWT, Swing, JavaFX & SWT 1
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
H JTextArea - farbige Zeilen .. bitte um Vorschläge zur Implementierung AWT, Swing, JavaFX & SWT 1
M Befüllung der einzelnen Zeilen des TableView AWT, Swing, JavaFX & SWT 3
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
X Zeilen aus einer Textdatei einzelnd als String abrufen AWT, Swing, JavaFX & SWT 8
T CSS Rechtsbüdniges Label mit Zwei Zeilen AWT, Swing, JavaFX & SWT 7
J JavaFX TableView - Höhe der Zeilen AWT, Swing, JavaFX & SWT 3
stylegangsta JDialog bestimmte Zeilen kursiv AWT, Swing, JavaFX & SWT 20
B Java FX TableView Zeilen mit verschiedenen Typen AWT, Swing, JavaFX & SWT 15
P jtabel Zeilen auswählbar, aber nicht editierbar AWT, Swing, JavaFX & SWT 3
P Swing JTable mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 1
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
J JavaFX eine Art Tabelle, jedoch mit mehreren Zeilen AWT, Swing, JavaFX & SWT 2
D Swing Bestimmte Berechnung von Spalten durchführen und dann die Zeilen nach bestimmten Kriterien einfärben AWT, Swing, JavaFX & SWT 5
D JGridLayout zwischen Zeilen bestimmter Abstand AWT, Swing, JavaFX & SWT 3
B Swing BalloonTip erscheint nicht in den ersten Zeilen einer JXTable AWT, Swing, JavaFX & SWT 4
Bluedaishi JTable alle Zeilen löschen AWT, Swing, JavaFX & SWT 7
K SWT DataBinding, Anzahl der Zeilen aktualisieren AWT, Swing, JavaFX & SWT 4
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
P gleichanfangende Zeilen solange auslesen bis es die gibt AWT, Swing, JavaFX & SWT 12
O Swing JLabel mehrere Zeilen AWT, Swing, JavaFX & SWT 2
B JToolBar dynamisch auf mehrere Zeilen erweitern AWT, Swing, JavaFX & SWT 2
O Swing JTable - Zeilen färben (mit Model) AWT, Swing, JavaFX & SWT 13
Nicklas2751 Table View zeigt keinen Inhalt nur leere Zeilen AWT, Swing, JavaFX & SWT 2
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
M JTable Zeilen und Zellen einfärben AWT, Swing, JavaFX & SWT 11
M Selektierte Zeilen von JTable AWT, Swing, JavaFX & SWT 10
M TextArea über mehrere Zeilen - wie Zeileanzahl abfragen? AWT, Swing, JavaFX & SWT 5
M JTable Zeilen einfärben AWT, Swing, JavaFX & SWT 13
A mehrere Zeilen in GUi ausgeben AWT, Swing, JavaFX & SWT 2
L JTableModel - Zeilen mit eigenem Index ausstatten AWT, Swing, JavaFX & SWT 4
S JEditorPane Zeilen zählen AWT, Swing, JavaFX & SWT 5
S Swing JTable Zeilen löschen AWT, Swing, JavaFX & SWT 21
J Swing JTable-Daten Speichern und bei zeilen-änderung beibehalten. AWT, Swing, JavaFX & SWT 6
B JTable Zeilen und Spalten selektieren AWT, Swing, JavaFX & SWT 5
kniffel Ausgabe von leeren JTable Zeilen AWT, Swing, JavaFX & SWT 3
L LayoutManager GridBagLayout leere Zeilen AWT, Swing, JavaFX & SWT 4
GianaSisters Swing jTable - Feldtext soll mehrere Zeilen haben AWT, Swing, JavaFX & SWT 3
Ollek JTextArea - Feste Zeilenanzahl(8 Zeilen) AWT, Swing, JavaFX & SWT 3
B 2D-Grafik Zeilen drehen im JEditorPane AWT, Swing, JavaFX & SWT 3
0 JTable leere Zeilen einfügen AWT, Swing, JavaFX & SWT 3
M Markieren von ganzen Zeilen in transparenten Tabellen AWT, Swing, JavaFX & SWT 6
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
D JTable mit mehrzeiligen Zeilen AWT, Swing, JavaFX & SWT 5
kodela Swing selektierte Zeilen in JTable AWT, Swing, JavaFX & SWT 3
O Anzahl der Zeilen im TableViewer AWT, Swing, JavaFX & SWT 12
B Swing Zeilen Rotation AWT, Swing, JavaFX & SWT 5
J Swing JList: Neue Zeilen mit fireIntervalAdded sind automatisch selektiert AWT, Swing, JavaFX & SWT 2
D Swing keine Tabellen Zeilen ohne Focus AWT, Swing, JavaFX & SWT 7
D Tabellen Header & Abstand der Zeilen AWT, Swing, JavaFX & SWT 8
D Swing JTable: über sichtbare Zeilen iterieren AWT, Swing, JavaFX & SWT 2
U JTable: Zeilen abhängig vom Datensatz einfärben AWT, Swing, JavaFX & SWT 4
E JTextarea verschluckt Zeilen AWT, Swing, JavaFX & SWT 5
A JComboBox-Zeilen in JTable AWT, Swing, JavaFX & SWT 2
martin82 Swing JXTable gefilterte Zeilen AWT, Swing, JavaFX & SWT 4
B JTable: Zeilen sortieren, aber bestimmte Zeilen fest lassen AWT, Swing, JavaFX & SWT 9
B Swing JTable: mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 3
M JTable - mehrere Zeilen selektieren AWT, Swing, JavaFX & SWT 7
M JTable einzelne Zeilen färben AWT, Swing, JavaFX & SWT 2
T GridLayout Zeilen Hintergrund AWT, Swing, JavaFX & SWT 5
A Swing JTable Zeilen einfügen verbieten AWT, Swing, JavaFX & SWT 3
elitebiber Swing Zeilen in einer JTable gruppieren AWT, Swing, JavaFX & SWT 3
Meldanor JTables - Zeilen hinzufügen/löschen AWT, Swing, JavaFX & SWT 4
T Wie Zeilen in Tabellen farblich differenzieren? AWT, Swing, JavaFX & SWT 3
R JScrollBar - Immer drei Zeilen weiter AWT, Swing, JavaFX & SWT 10
O Zeilen in JTable auf Grund eines Wertes einfärben AWT, Swing, JavaFX & SWT 6
R Suchbare Zeilen von JTable in JScrollPane ermitteln AWT, Swing, JavaFX & SWT 9
D Jlist auf 10 Zeilen begrenzen geht bei mir nicht AWT, Swing, JavaFX & SWT 2
O JTable Zeilen "nach oben" verschieben AWT, Swing, JavaFX & SWT 3
R Daten in JTable in mehreren Zeilen darstellen AWT, Swing, JavaFX & SWT 11
A Multiple Zeilen in einer JTable Zelle AWT, Swing, JavaFX & SWT 6
A Drag & Drop von Zeilen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 2
F Per KeyListener Zeilen aus JTable löschen AWT, Swing, JavaFX & SWT 9
K Mehrere Zeilen auf einem Button AWT, Swing, JavaFX & SWT 2
M JScrollbar + JTable + Zeilen wie in Excel hinzufügen AWT, Swing, JavaFX & SWT 14
D Ireport - Summe bilden von einzelnen Zeilen? AWT, Swing, JavaFX & SWT 1
S JTable zwei Text-Zeilen in einer Zelle AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben