Java 如何更新JTextPane中已经存在的行?

Java 如何更新JTextPane中已经存在的行?,java,user-interface,document,jtextpane,Java,User Interface,Document,Jtextpane,我想在JTextPane中添加几行,如Joseph Red、Clarita Red、Bob Red,然后我想更新特定行的名称和颜色,例如,我想将Joseph Red更改为Rudo Blue,或将Bob Red更改为Molly Blue。有没有办法做到这一点?我想在向JTextPane添加一行时记录每一行,并引用该行以在以后更新,但想不出方法 String color = "Red"; JTextPane textPanel = new JTextPane(); public void addT

我想在JTextPane中添加几行,如Joseph Red、Clarita Red、Bob Red,然后我想更新特定行的名称和颜色,例如,我想将Joseph Red更改为Rudo Blue,或将Bob Red更改为Molly Blue。有没有办法做到这一点?我想在向JTextPane添加一行时记录每一行,并引用该行以在以后更新,但想不出方法

String color = "Red";
JTextPane textPanel = new JTextPane();

public void addToTextPane(String name) throws BadLocationException //Add each line to JTextPane
{
    document = (StyledDocument) textPanel.getDocument();
    document.insertString(document.getLength(), name + "" + color, null);
    document.insertString(document.getLength(), "\n", null);
}
我正在尝试执行以下操作(更新JTextPane中已经存在的特定行的名称和颜色):


循环的
for
Document#getText
Document#remove
Document#insertString
结合使用应该可以达到这个目的

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextPane textPane;
        private String fruit[] = {"Bananas", "Apples", "Oranges", "Kiwis"};
        private int index;

        public TestPane() {

            StringBuilder text = new StringBuilder(64);
            text.append("Bananas in pajamas are coming down the stairs\n").
                            append("Bananas in pajamas are coming down in pairs\n").
                            append("Bananas in pajamas are chasing teddy bears\n").
                            append("Cause on tuesdays they try to catch their man-o-wears");

            textPane = new JTextPane();
            textPane.setText(text.toString());
            setLayout(new BorderLayout());

            add(new JScrollPane(textPane));

            JButton btn = new JButton("Update");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    index++;
                    String find = fruit[(index - 1) % fruit.length];
                    String replace = fruit[index % fruit.length];
                    System.out.println("Find: " + find);
                    System.out.println("Replace: " + replace);

                    Document doc = textPane.getDocument();

                    try {
                        for (int pos = 0; pos < doc.getLength() - find.length(); pos++) {

                            String text = doc.getText(pos, find.length());
                            if (find.equals(text)) {
                                doc.remove(pos, find.length());
                                doc.insertString(pos, replace, null);
                            }

                        }
                    } catch (BadLocationException exp) {
                        exp.printStackTrace();
                    }

                }
            });

            add(btn, BorderLayout.SOUTH);

        }

    }

}

导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextPane;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.Document;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
私有JTextPane textPane;
私人串水果[]={“香蕉”、“苹果”、“橙子”、“猕猴桃”};
私有整数索引;
公共测试窗格(){
StringBuilder文本=新的StringBuilder(64);
text.append(“穿着睡衣的香蕉下楼来了\n”)。
append(“穿睡衣的香蕉成双下山了”\n”)。
追加(“穿着睡衣的香蕉正在追赶泰迪熊\n”)。
附加(“因为在星期二他们试图抓住他们的男装”);
textPane=新的JTextPane();
textPane.setText(text.toString());
setLayout(新的BorderLayout());
添加(新的JScrollPane(textPane));
JButton btn=新JButton(“更新”);
btn.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
索引++;
字符串find=fruit[(索引-1)%fruit.length];
字符串替换=水果[索引%fruit.length];
System.out.println(“Find:+Find”);
System.out.println(“替换:”+Replace);
Document doc=textPane.getDocument();
试一试{
对于(int pos=0;pos
您可以搜索
文档
并替换现有单词的匹配项…@mad程序员有点不知所措。你介意展示我的例子吗?@MadProgrammer你能帮我吗?谢谢+1,但无需删除/插入。setCharacterAttributes()是enough@StanislavL我认为这个问题的意思是op想要替换文本,而不是属性,但我知道什么:P@MadProgrammer你们能不能把我的代码整合在一起?我似乎不能把它用在我的身上。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextPane textPane;
        private String fruit[] = {"Bananas", "Apples", "Oranges", "Kiwis"};
        private int index;

        public TestPane() {

            StringBuilder text = new StringBuilder(64);
            text.append("Bananas in pajamas are coming down the stairs\n").
                            append("Bananas in pajamas are coming down in pairs\n").
                            append("Bananas in pajamas are chasing teddy bears\n").
                            append("Cause on tuesdays they try to catch their man-o-wears");

            textPane = new JTextPane();
            textPane.setText(text.toString());
            setLayout(new BorderLayout());

            add(new JScrollPane(textPane));

            JButton btn = new JButton("Update");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    index++;
                    String find = fruit[(index - 1) % fruit.length];
                    String replace = fruit[index % fruit.length];
                    System.out.println("Find: " + find);
                    System.out.println("Replace: " + replace);

                    Document doc = textPane.getDocument();

                    try {
                        for (int pos = 0; pos < doc.getLength() - find.length(); pos++) {

                            String text = doc.getText(pos, find.length());
                            if (find.equals(text)) {
                                doc.remove(pos, find.length());
                                doc.insertString(pos, replace, null);
                            }

                        }
                    } catch (BadLocationException exp) {
                        exp.printStackTrace();
                    }

                }
            });

            add(btn, BorderLayout.SOUTH);

        }

    }

}