2012-04-08 14 views

答えて

2

あなたはreplaceRange()

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

は、指定された新しいテキストでた開始位置から終了位置までのテキストを置き換えます使用することができます。モデルがnullの場合は何もしません。新しい文字列がnullまたは空の場合は、単に削除します。

このメソッドはスレッドセーフですが、ほとんどのSwingメソッドはそうではありません。詳細についてはスレッドとスイングを参照してください。

+0

おかげで、しかし、私は次の例外を取得しています: –

+0

java.lang.IllegalStateException:通知 \tに突然変異する試みをjavax.swing.text.AbstractDocument.writeLock(不明なソース)でjavax.swing.text.AbstractDocument.replace(不明なソース)javax.swing.JTextArea.replaceRangeで \t(不明なソース)で \tで \t MyTextArea $ MyDocumentListener .insertUpdate(MyTextArea.java: 75)javax.swing.text.AbstractDocument.fireInsertUpdate(不明なソース)javax.swing.text.AbstractDocument.handleInsertStringで \t(不明なソース)で \t javax.swing.text.AbstractDocument.insertStringで \t(不明なソース) \t at javax.swing.text.PlainDocument.insertString –

+0

+1、これはあまりにもうまく動作します:-)私よりも、1行で:-) @BoleGratは間違った場所でやっているようですが、私が推測する正しい場所ではない 'DocumentFilter'の内部では、この場所ではDocument自体を変更することはできません。 –

2

次の3つの方法setSelectionStart(...)setSelectionEnd(...)replaceSelection(...)を見てする必要があります。ここで

は、あなたの原因を助けるために、少量のサンプルプログラムです:あなたの答えJigarため

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の提案ですが、以前と同じ問題が発生しています。正直なところ、私はsetSelection()を使用してそれを作りたくありません。私はreplaceString()やinsert()を使うほうが好きです。私はすべてのケースで同じ例外が発生し続けます:( –

+0

参照してください。もし私がそれを行うなら、@ JigarJoshiがアドバイスしたように、この新しい編集済みの回答でうまくいきます。 –

+0

私はtarea.replaceRange( "house"、4,7);内部でDocumentListener :: insertUpdate()イベントが発生しました。シンプルなもので、この例外が表示されます –

関連する問題