JTextArea - 如何在指定的偏移处设置文本?

时间:2012-04-08 07:28:04

标签: java swing offset jtextarea settext

我想在JTextArea的指定偏移处设置一些文字。假设我已经在我的编辑"aaa bbb"中,我想用“house”覆盖"bbb",我怎么能用Java做呢?

2 个答案:

答案 0 :(得分:2)

您可以使用replaceRange()

  

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

     

使用指定的新文本替换指示的开始位置到结束位置的文本。如果模型为null,则不执行任何操作。如果新字符串为null或为空,只需删除。

     

此方法是线程安全的,但大多数Swing方法都不是。有关更多信息,请参阅线程和Swing。

答案 1 :(得分:2)

您需要查看三种方法setSelectionStart(...)setSelectionEnd(...)replaceSelection(...)

以下是一个帮助您解决问题的小型示例程序:

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();
            }
        });
    }
}