# Formatierung eines selektierten Textes in einem JTextPane



## dreamerli (2. Juli 2004)

Wie kann ich den Style (bold, italic, underline...) von einem String auslesen?
Der String ist aus einem JTextPane.

Bitte helft mir! Es ist dringend


----------



## Thomas Darimont (2. Juli 2004)

Hallo!

Schau mal ob das folgende Programm dir hilft....

```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

/**
 * @author      Darimont<br>
 * @version     1.0<br>
 */

public class JTextPaneTest extends JFrame {

	private final JButton btnFormat, btnPrintFormat;
	private final JTextPane textPane;
	private final JScrollPane scrollPane;

	public JTextPaneTest() {
		super("JTextPaneTest");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final ActionHandler actionHandler = new ActionHandler();

		//Dieser Button Formatiert den selektierten Text Fett
		btnFormat = new JButton("Format");
		btnFormat.addActionListener(actionHandler);
		//Dieser Butotn gibt für jedes Zeichen in der Selektion dessen
		//Formatierung aus.
		btnPrintFormat = new JButton("Print Format");
		btnPrintFormat.addActionListener(actionHandler);
		scrollPane = new JScrollPane();
		textPane = new JTextPane();
		textPane.setPreferredSize(new Dimension(320, 240));

		scrollPane.getViewport().add(textPane);

		getContentPane().add(scrollPane, BorderLayout.NORTH);
		getContentPane().add(btnFormat, BorderLayout.CENTER);
		getContentPane().add(btnPrintFormat, BorderLayout.SOUTH);

		pack();
		setVisible(true);
	}

	public static void main(final String[] args) {
		new JTextPaneTest();
	}

	class ActionHandler implements ActionListener {

		public void actionPerformed(final ActionEvent e) {
			final Object src = e.getSource();
			if (src == btnFormat) {
				formatSelectedText();
			} else if (src == btnPrintFormat) {
				printFormatOfSelectedText();
			}
		}

		/**
		 * 
		 */
		private void printFormatOfSelectedText() {
			System.out.println("printFormatOfSelectedText");

			final int startPos = textPane.getSelectionStart();
			final int endPos = textPane.getSelectionEnd();

			StyledDocument doc = (StyledDocument) textPane.getDocument();

			final MutableAttributeSet testSet = new SimpleAttributeSet();
			StyleConstants.setBold(testSet, true);

			try {
				for (int i = startPos; i < endPos; i++) {
					final Element element = doc.getCharacterElement(i);
					if (element.getAttributes().containsAttributes(testSet)) {
						System.out.println(doc.getText(i, 1) + " is bold!");
					}
				}
			} catch (final BadLocationException e) {
				e.printStackTrace();
			}

		}

		/**
		 * 
		 */
		private void formatSelectedText() {
			System.out.println("formatSelectedText");

			final MutableAttributeSet attributeSet = new SimpleAttributeSet();
			StyleConstants.setBold(attributeSet, true);

			final int startPos = textPane.getSelectionStart();
			final int endPos = textPane.getSelectionEnd();

			final StyledDocument doc = (StyledDocument) textPane.getDocument();
			doc.setCharacterAttributes(
				startPos,
				endPos - startPos,
				attributeSet,
				true);

		}

	}
}
```

Gib einfach mal: "Hallo Welt!" ein, selektiere "Welt!" und klicke auf "Format".
Danach selektierst du einfach mal den gesamten Text und klickst auf "PrintFormat".

Es gibt mit Sicherheit auch elegante Lösungen zu dem Problem, aber vielleicht ist das hier für dich mal ein erster Ansatz...

Gruß Tom


----------

