Jar*_*edL 9 java swing jtextpane jtextcomponent styleddocument
我一直在寻找这个,到目前为止,我能够想出的是如何创建一个样式并将其应用于这样的角色:
StyledDocument doc = (StyledDocument) new DefaultStyledDocument();
JTextPane textpane = new JTextPane(doc);
textpane.setText("Test");
javax.swing.text.Style style = textpane.addStyle("Red", null);
StyleConstants.setForeground(style, Color.RED);
doc.setCharacterAttributes(0, 1, textpane.getStyle("Red"), true);
Run Code Online (Sandbox Code Playgroud)
如果您的文档中只有少量样式并希望按名称存储它们,以便以后可以轻松应用它们,这将非常有用.在我的应用程序中,我希望能够为文本中的每个字符独立设置前景色(仅少数值之一)和背景色(灰度,许多不同的值).为此创建潜在的数百/数千种不同风格似乎是一种巨大的浪费.有没有办法设置这些属性,而不必每次都创建一个新的样式?如果我只需渲染文本会更容易,但我也需要使其可编辑.有没有办法做到这一点JTextPane,还是有另一个提供此功能的swing类?
Gui*_*let 14
如果要更改文本窗格中每个字符的样式,这里有一个完全随机的方法.您为每个字符创建不同的属性集.由你来找到合适的组合(前景/背景对比,字符大小差别不大等等).您还可以存储已应用的不同样式,这样就不会使用相同的样式两次.

import java.awt.Color;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class TestDifferentStyles {
private void initUI() {
JFrame frame = new JFrame(TestDifferentStyles.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
StyledDocument doc = new DefaultStyledDocument();
JTextPane textPane = new JTextPane(doc);
textPane.setText("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has "
+ "been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of "
+ "type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the "
+ "leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the"
+ " release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing "
+ "software like Aldus PageMaker including versions of Lorem Ipsum.");
Random random = new Random();
for (int i = 0; i < textPane.getDocument().getLength(); i++) {
SimpleAttributeSet set = new SimpleAttributeSet();
// StyleConstants.setBackground(set, new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
StyleConstants.setForeground(set, new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
StyleConstants.setFontSize(set, random.nextInt(12) + 12);
StyleConstants.setBold(set, random.nextBoolean());
StyleConstants.setItalic(set, random.nextBoolean());
StyleConstants.setUnderline(set, random.nextBoolean());
doc.setCharacterAttributes(i, 1, set, true);
}
frame.add(new JScrollPane(textPane));
frame.setSize(500, 400);
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestDifferentStyles().initUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定你的意思,但是你不能JtextPane循环遍历该循环中的每个字符并遍历你想要突出显示的所有字母/字符等.有if语句检查字符然后相应地设置Style.
这是我做的一个例子我只为字符h和w实现它以用于演示目的:

//necessary imports
import java.awt.Color;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class Test {
/**
* Default constructor for Test.class
*/
public Test() {
initComponents();
}
public static void main(String[] args) {
/**
* Create GUI and components on Event-Dispatch-Thread
*/
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Test test = new Test();
}
});
}
/**
* Initialize GUI and components (including ActionListeners etc)
*/
private void initComponents() {
JFrame jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
StyledDocument doc = (StyledDocument) new DefaultStyledDocument();
JTextPane textPane = new JTextPane(doc);
textPane.setText("Hello, world! :)");
//create necessary styles for various characters
javax.swing.text.Style style = textPane.addStyle("Red", null);
StyleConstants.setForeground(style, Color.RED);
javax.swing.text.Style style2 = textPane.addStyle("Blue", null);
StyleConstants.setForeground(style2, Color.BLUE);
//create array of characters to check for and style
String[] lettersToEdit = new String[]{"h", "w"};
//create arraylist to hold each character in textPane
ArrayList<String> strings = new ArrayList<>();
//get all text
String text = textPane.getText();
//populate arraylist
for (int i = 0; i < text.length(); i++) {
strings.add(text.charAt(i) + "");
}
//declare variabe to hold position
int position = 0;
for (String s1 : strings) {//for each character in the textpane text
for (String s2 : lettersToEdit) {//for each character in array to check (lettersToEdit)
if (s2.toLowerCase().equalsIgnoreCase(s1)) {//if there was a match
System.out.println("found a match: " + s1);
System.out.println("counter: " + position + "/" + (position + 1));
//check which chacacter we matched
if (s1.equalsIgnoreCase(lettersToEdit[0])) {
//set appropriate style
doc.setCharacterAttributes(position, 1, textPane.getStyle("Red"), true);
}
if (s1.equalsIgnoreCase(lettersToEdit[1])) {
doc.setCharacterAttributes(position, 1, textPane.getStyle("Blue"), true);
}
}
}
//increase position after each character on textPane is parsed
position++;
}
jFrame.add(textPane);
//pack frame (size JFrame to match preferred sizes of added components and set visible
jFrame.pack();
jFrame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10098 次 |
| 最近记录: |