【问题标题】:JTextArea - How to set text at a specified offset?JTextArea - 如何在指定的偏移量处设置文本?
【发布时间】:2012-04-08 07:28:04
【问题描述】:

我想在我的JTextArea 中的指定偏移处设置一些文本。假设我已经在编辑 "aaa bbb" 并且我想用“house”覆盖 "bbb",我该如何在 Java 中做到这一点?

【问题讨论】:

    标签: java swing offset jtextarea settext


    【解决方案1】:

    你可以使用replaceRange()

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

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

    这个方法是线程安全的,虽然大多数 Swing 方法不是。有关更多信息,请参阅线程和 Swing。

    【讨论】:

    • 感谢您的回答 Jigar,但是我收到以下异常:
    • java.lang.IllegalStateException:尝试在 javax.swing.text.AbstractDocument.replace(Unknown Source) 处的 javax.swing.text.AbstractDocument.writeLock(Unknown Source) 处的通知中进行变异。 swing.JTextArea.replaceRange(Unknown Source) at MyTextArea$MyDocumentListener.insertUpdate(MyTextArea.java:75) at javax.swing.text.AbstractDocument.fireInsertUpdate(Unknown Source) at javax.swing.text.AbstractDocument.handleInsertString(Unknown Source)在 javax.swing.text.AbstractDocument.insertString(Unknown Source) at javax.swing.text.PlainDocument.insertString(Unknown Source)
    • +1,这工作得太好了 :-) 比我的更好,单行 :-) @BoleGrat,好像你在错误的地方做这件事,在 DocumentFilter 里面,这是不对的我猜的地方,在这个地方,你不能对文档本身进行更改。
    • nIcE cOw:你说得对,我会尝试做一些不同的事情。感谢您的建议。
    【解决方案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();
                }
            });
        }
    }
    

    【讨论】:

    • nIcE cOw, ty 的建议,但出现与以前相同的问题,老实说,我不想使用 setSelection()。我更喜欢使用 replaceString() 或 insert()。在所有情况下,我都会继续遇到相同的异常:(
    • 看看如果我这样做,它在这个新编辑的答案中运行良好,正如@JigarJoshi 建议的那样
    • 我正在添加 tarea.replaceRange("house", 4, 7);在 DocumentListener::insertUpdate() 事件中。简单的东西,它给了我这个例外。
    • 是的,在 DocumentListener 中,你不能这样做。在DocumentListener 内无法更新文档。因为那时它在 Document 上有一个写锁。请参阅此最新更新。让我也检查一下,从我这边
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多