2017-10-05 11 views
1

JTextArea編集可能なものを終了し、すでに編集済みのものを編集できないようにする方法はありますか?編集可能なJTextAreaの終わりを作る方法

「Hello World」をJTextAreaに書き込んだ場合、「Hello World」の後にユーザーが入力できるようにするにはどうすればよいですか?すでに印刷されているテキストを削除するか削除しますか?

以下

私が欲しいものである。..例では、ユーザは、彼らが好きなテキスト入力することができる

public class Test { 
    public static void main(String[] args) { 
     //Here I create a simple JFrame with JTextArea 
     JTextArea textArea = new JTextArea(); 
     JFrame frame = new JFrame(); 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     frame.setSize(250, 250); 
     textArea.setEditable(true); 
     textArea.setVisible(true); 
     frame.add(textArea); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


     /*Here I print "Hello World" onto the text area.. after the ">>" I want the 
     the user to be able to type whatever they want.. however I don't want them 
     to be able to edit the "Hello World"*/ 
     textArea.append("Hello World\n>>"); 
     textArea.setCaretPosition(textArea.getDocument().getLength()); 
    } 
} 

...私の悩みを実証するための小さなプログラムですが...しかし、彼らはまた、ことができます私が望んでいないappend ..を使って印刷したテキストを編集する

どうすればこの問題を解決できますか?

+1

DocumentFilterが動作する可能性があります。私はそれを試してみたい。 –

+3

こちら[こちら](https://stackoverflow.com/questions/15017148/jtextarea-as-io-console/15025085#15025085);) – MadProgrammer

答えて

4

はい、DocumentFilterは機能します。追加がドキュメントの最後にある場合、つまりオフセットがドキュメントの長さに等しい場合にのみ、テキストの追加を許可するものを作成します。また、removeメソッドを完全に非アクティブ化します。そのような何か:

import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

public class MyFilter extends DocumentFilter { 
    @Override 
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) 
      throws BadLocationException { 
     // only insert text if at the end of the document 
     // if offset == document length 
     if (offset == fb.getDocument().getLength()) { 
      super.insertString(fb, offset, string, attr); 
     } 
    } 

    @Override 
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) 
      throws BadLocationException { 
     // only replace text if at the end of the document 
     // if offset == document length 
     if (offset == fb.getDocument().getLength()) { 
      super.replace(fb, offset, length, text, attrs); 
     } 
    } 

    @Override 
    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException { 
     // do nothing. Totally inactivate this 
    } 
} 

そして、あなたがそうのようにそれをテストすることができは:

import javax.swing.*; 
import javax.swing.text.PlainDocument; 

@SuppressWarnings("serial") 
public class LimitedTextArea extends JPanel { 
    private JTextArea textArea = new JTextArea(15, 50); 

    public LimitedTextArea() { 
     // get textArea's Document and cast to PlainDocument: 
     PlainDocument document = (PlainDocument) textArea.getDocument(); 
     // set the document's filter with "MyFilter" 
     document.setDocumentFilter(new MyFilter()); 

     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
     JScrollPane scrollPane = new JScrollPane(textArea); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     add(scrollPane); 
    } 

    private static void createAndShowGui() { 
     LimitedTextArea mainPanel = new LimitedTextArea(); 

     JFrame frame = new JFrame("LimitedTextArea"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
1

また、使用することができNavigationFilter:これは、ユーザーがテキストを編集することができます

import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class NavigationFilterPrefix extends NavigationFilter 
{ 
    private int prefixLength; 
    private Action deletePrevious; 

    public NavigationFilterPrefix(int prefixLength, JTextComponent component) 
    { 
     this.prefixLength = prefixLength; 
     deletePrevious = component.getActionMap().get("delete-previous"); 
     component.getActionMap().put("delete-previous", new BackspaceAction()); 
     component.setCaretPosition(prefixLength); 
    } 

    @Override 
    public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) 
    { 
     fb.setDot(Math.max(dot, prefixLength), bias); 
    } 

    @Override 
    public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) 
    { 
     fb.moveDot(Math.max(dot, prefixLength), bias); 
    } 

    class BackspaceAction extends AbstractAction 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      JTextComponent component = (JTextComponent)e.getSource(); 

      if (component.getCaretPosition() > prefixLength) 
      { 
       deletePrevious.actionPerformed(null); 
      } 
     } 
    } 

    private static void createAndShowUI() 
    { 
     JTextField textField = new JTextField("Prefix_", 20); 
     textField.setNavigationFilter(new NavigationFilterPrefix(7, textField)); 

     JFrame frame = new JFrame("Navigation Filter Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(textField); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

彼らテキストフィールドに追加します。

これにより、固定テキストが選択されなくなります。

さらに高度な機能については、Protected Documentを参照してください。これにより、ドキュメントの複数の領域が変更されるのを防ぐことができます。

関連する問題