javax.swing.JTextPane
Es ist relativ einfach möglich in einer JTextPane einzelne Bereiche nur lesbar (read-only) zu machen.
Das folgende Beispiel macht das Wort „crazy“ read-only (und grau):
import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.Style; import javax.swing.text.StyleConstants; import javax.swing.text.StyleContext; import javax.swing.text.StyledDocument; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; public class ReadOnlyTextPane extends JFrame { public ReadOnlyTextPane() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setLocationRelativeTo(null); init(); } private void init() { Container cp = getContentPane(); cp.setLayout(new BorderLayout()); final JTextPane editor = new JTextPane(); cp.add(new JScrollPane(editor), BorderLayout.CENTER); initEditorWithText(editor); } private void initEditorWithText(JTextPane editor) { editor.setContentType("text/rtf"); StyledDocument doc = (StyledDocument) editor.getDocument(); Style defaultStyle = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE); Style readonlyStyle = doc.addStyle("readonlyStyle", defaultStyle); StyleConstants.setForeground(readonlyStyle, Color.GRAY); SimpleAttributeSet readOnlyAttributeSet = new SimpleAttributeSet(doc.getStyle("readonlyStyle")); readOnlyAttributeSet.addAttribute("readonly", true); try { ((AbstractDocument) doc).setDocumentFilter(new InputFilter(editor)); doc.insertString(doc.getLength(), "Hello ", null); doc.insertString(doc.getLength(), "crazy", readOnlyAttributeSet); doc.insertString(doc.getLength(), " world!", null); System.out.println("Gesamter Text: " + doc.getText(0, doc.getLength())); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new ReadOnlyTextPane().setVisible(true); } } class InputFilter extends DocumentFilter { JTextPane editor; public InputFilter(JTextPane editor) { this.editor = editor; } @Override public void remove(final FilterBypass fb, final int offset, final int length) throws BadLocationException { if (!isReadOnly()) { super.remove(fb, offset, length); } } @Override public void replace(final FilterBypass fb, final int offset, final int length, final String text, final AttributeSet attrs) throws BadLocationException { if (!isReadOnly()) { super.replace(fb, offset, length, text, attrs); } } private boolean isReadOnly() { AttributeSet attributeSet = editor.getCharacterAttributes(); return attributeSet != null && attributeSet.getAttribute("readonly") != null; } }
Stichworte:
JTextPane, Versteckter Text, hidden Text, read-only Text, verborgener Text, versteckt, verborgen, readonly, JEditorPane