Java - AWT/Swing

JTextPane

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

Eigene Werkzeuge
Werkzeuge

gratis Counter by GOWEB
seit 9.10.2007