2012-04-08 9 views

Antwort

2

könnten Sie verwenden replaceRange()

public void replaceRange(String str, int start, int end)

Text aus dem angegebenen Start Ersetzt angegebenen Position mit dem neuen Text zu beenden. Tut nichts, wenn das Modell null ist. Führt einfach einen Löschvorgang durch, wenn die neue Zeichenfolge null oder leer ist.

Diese Methode ist Thread-sicher, obwohl die meisten Swing-Methoden nicht sind. Weitere Informationen finden Sie unter Threads und Swing.

+0

Vielen Dank für Ihre Antwort Jigar, ich bin jedoch die folgende Ausnahme erhalten: –

+0

java.lang.IllegalStateException: Der Versuch, in Benachrichtigung \t zu mutieren bei javax.swing.text.AbstractDocument.writeLock (Unknown Source) \t bei javax.swing.text.AbstractDocument.replace (Unknown Source) \t bei javax.swing.JTextArea.replaceRange (Unknown Source) \t bei MyTextArea $ MyDocumentListener .insertUpdate (MyTextArea.java: 75) \t bei javax.swing.text.AbstractDocument.fireInsertUpdate (Unknown Source) \t bei javax.swing.text.AbstractDocument.handleInsertString (Unknown Source) \t bei javax.swing.text.AbstractDocument.insertString (Unknown Source) \t bei javax.swing.text.PlainDocument.insertString (Unbekannte Quelle) –

+0

+1, das funktioniert zu gut :-) Besser als meins, in einer Zeile :-) @BoleGrat, scheint wie du es am falschen Ort machst, in "DocumentFilter", das ist nicht der richtige Ort, ich denke, an dieser Stelle können Sie nicht Änderungen am Dokument selbst vornehmen. –

2

Sie benötigen einen Blick auf drei Methoden setSelectionStart(...), setSelectionEnd(...) und replaceSelection(...) zu nehmen.

Hier ist ein kleines Beispielprogramm Ihre Ursachen zu helfen:

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

public class TextAreaSelection 
{ 
    private JTextField replaceTextField; 
    private JTextField startIndexField; 
    private JTextField endIndexField; 

    private void createAndDisplayGUI() 
    { 
     final JFrame frame = new JFrame("JTextArea Selection"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setLocationByPlatform(true); 

     JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new BorderLayout(5, 5)); 
     contentPane.setOpaque(true); 

     final JTextArea tarea = new JTextArea(10, 10); 
     tarea.setText("aaa bbb"); 

     final JButton updateButton = new JButton("UPDATE TEXT"); 
     updateButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       //tarea.setSelectionStart(4); 
       //tarea.setSelectionEnd(7); 
       //tarea.replaceSelection("house"); 
       int selection = JOptionPane.showConfirmDialog(null, getPanel()); 
       if (selection == JOptionPane.OK_OPTION) 
       { 
        if (replaceTextField.getDocument().getLength() > 0 
         && startIndexField.getDocument().getLength() > 0 
         && endIndexField.getDocument().getLength() > 0) 
        { 
         String text = replaceTextField.getText().trim(); 
         int start = Integer.parseInt(startIndexField.getText().trim()); 
         int end = Integer.parseInt(endIndexField.getText().trim()); 
         tarea.replaceRange(text, start, end); 
        } 
       } 
      } 
     }); 

     contentPane.add(tarea, BorderLayout.CENTER); 
     contentPane.add(updateButton, BorderLayout.PAGE_END); 

     frame.getContentPane().add(contentPane); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private JPanel getPanel() 
    { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(0, 2, 2, 2)); 

     JLabel replaceLabel = new JLabel("Enter new String : " 
               , JLabel.CENTER); 
     replaceTextField = new JTextField(10); 

     JLabel startIndexLabel = new JLabel("Enter Start Index : " 
               , JLabel.CENTER); 
     startIndexField = new JTextField(10); 

     JLabel endIndexLabel = new JLabel("Enter End Index : "); 
     endIndexField = new JTextField(10); 

     panel.add(replaceLabel); 
     panel.add(replaceTextField); 
     panel.add(startIndexLabel); 
     panel.add(startIndexField); 
     panel.add(endIndexLabel); 
     panel.add(endIndexField); 

     return panel; 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TextAreaSelection().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 
+0

NICE cOw, ty für den Vorschlag, aber es tritt das gleiche Problem wie zuvor auf und ehrlich gesagt möchte ich es nicht mit setSelection() machen. Ich bevorzuge die Verwendung von replaceString() oder insert(). Ich bekomme weiterhin die gleiche Ausnahme in allen Fällen :( –

+0

Siehe Wenn ich es mache, es funktioniert gut in dieser neu bearbeiteten Antwort, wie von @JigarJoshi empfohlen –

+0

Ich füge tarea.replaceRange ("Haus", 4, 7); Inside DocumentListener :: insertUpdate() -Ereignis. Einfaches Zeug und es gibt mir diese Ausnahme. –