我有一个JTextPane,与stenledDocuent。我以编程方式插入了文本:“你好世界”。“你好”是红色的,“世界”是绿色的。有什么方法可以选择这两个单词,选择矩形变成一半红色一半绿色(或者所选字符的任何颜色)?通过选择,我的意思是,在运行时选择文本,而不是以编程方式...
我相信在这里改变选定文本的颜色在jTextPane,StanislavL告诉如何可以实现这一点,我不知道如何实现它。
编辑:
SimpleAttributeSet aset = new SimpleAttributeSet();
StyleConstants.setForeground(aset, Color.RED);
muTextPane.setCharacterAttributes(aset, false);
try {
muTextPane.getStyledDocument().insertString(muTextPane.getCaretPosition(), "Hello", aset);
muTextPane.setCaretPosition(muTextPane.getStyledDocument().getLength());
} catch (BadLocationException ex) {
Logger.getLogger(View1.class.getName()).log(Level.SEVERE, null, ex);
}
StyleConstants.setForeground(aset, Color.GREEN);
muTextPane.setCharacterAttributes(aset, false);
try {
muTextPane.getStyledDocument().insertString(muTextPane.getCaretPosition(), " World", aset);
muTextPane.setCaretPosition(muTextPane.getStyledDocument().getLength());
} catch (BadLocationException ex) {
Logger.getLogger(View1.class.getName()).log(Level.SEVERE, null, ex);
}
看看这对你需要的是否足够好。可能有更好的方法来做这件事,但它适用于你的例子。
public class ColorTextPane extends JFrame {
static JTextPane muTextPane = new JTextPane();
public static void main(String[] args) {
new ColorTextPane();
}
public ColorTextPane() {
///// Code from the question /////
SimpleAttributeSet aset = new SimpleAttributeSet();
StyleConstants.setForeground(aset, Color.RED);
StyleConstants.setFontSize(aset, 14);
muTextPane.setCharacterAttributes(aset, false);
try {
muTextPane.getStyledDocument().insertString(muTextPane.getCaretPosition(), "Hello", aset);
muTextPane.setCaretPosition(muTextPane.getStyledDocument().getLength());
} catch (BadLocationException ex) {
ex.printStackTrace();
}
StyleConstants.setForeground(aset, Color.GREEN);
muTextPane.setCharacterAttributes(aset, false);
try {
muTextPane.getStyledDocument().insertString(muTextPane.getCaretPosition(), " World", aset);
muTextPane.setCaretPosition(muTextPane.getStyledDocument().getLength());
} catch (BadLocationException ex) {
ex.printStackTrace();
}
///// End code from the question /////
muTextPane.setHighlighter(new MyHighlighter());
add(muTextPane);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private static class MyHighlighter extends DefaultHighlighter {
private static List<Interval> ranges = new ArrayList<>();
private static Map<Interval, Color> rangesColors = new HashMap<>();
private static LayeredHighlighter.LayerPainter DefaultPainter = new MyDHP(null);
@Override
public Object addHighlight(int p0, int p1, HighlightPainter p) throws BadLocationException {
return super.addHighlight(p0, p1, DefaultPainter);
}
@Override
public void removeHighlight(Object tag) {
super.removeHighlight(tag);
ranges.clear();
rangesColors.clear();
}
private static class MyDHP extends DefaultHighlightPainter {
public MyDHP(Color arg0) {
super(arg0);
}
@Override
public Shape paintLayer(Graphics g, int offs0, int offs1, Shape bounds, JTextComponent c, View view) {
Rectangle r;
if (offs0 == view.getStartOffset() && offs1 == view.getEndOffset()) {
// Contained in view, can just use bounds.
if (bounds instanceof Rectangle)
r = (Rectangle) bounds;
else
r = bounds.getBounds();
}
else {
// Should only render part of View.
try {
// --- determine locations ---
Shape shape = view.modelToView(offs0, Position.Bias.Forward,
offs1,Position.Bias.Backward, bounds);
r = (shape instanceof Rectangle) ? (Rectangle)shape : shape.getBounds();
} catch (BadLocationException e) {
// can't render
r = null;
}
}
if (r != null) {
// If we are asked to highlight, we should draw something even
// if the model-to-view projection is of zero width (6340106).
r.width = Math.max(r.width, 1);
// Override simple fillRect
Interval newInt = new Interval(offs0, offs1);
for (Interval interval : ranges) {
if (interval.semiIncludes(newInt)) {
g.setColor(rangesColors.get(interval));
g.fillRect(r.x, r.y, r.width, r.height);
return r;
}
}
ranges.add(newInt);
rangesColors.put(newInt, getColor());
g.setColor(rangesColors.get(newInt));
g.fillRect(r.x, r.y, r.width, r.height);
}
return r;
}
@Override
public Color getColor() {
return StyleConstants.getForeground(muTextPane.getCharacterAttributes());
}
}
}
}
class Interval {
int start;
int end;
Interval(int p0, int p1) {
start = Math.min(p0, p1);
end = Math.max(p0, p1);
}
boolean semiIncludes(Interval intv) {
if (intv.start == this.start || intv.end == this.end)
return true;
return false;
}
}
我创建并设置一个新的Highlight
,它保留文档中每个偏移范围的颜色。它也有自己的LayeredHighlight。LayerPainter
,其中我部分重写了画家Layer
方法(其中一些是从源复制粘贴)。
Interval
类只是一个帮助实用程序,您可以删除它并将其功能添加到高亮显示机制中。
我正在使用JTextPane创建一个文本编辑器,它允许用户更改所选文本的颜色。但是当用户选择文本时,然后选择更改颜色的选项(比如,改为红色),直到取消选择文本时,文本才会显示为红色。我尝试使用setSelectedTextColor来更改所选文本的颜色,但这不起作用,因为当之后选择文本时,它会将文本更改为红色。有没有一种方法可以使选定的文本显示为它的实际颜色?或者像它在Word中的工作方式那样,它
我创建了一个使用JTextPane的Swing界面。使用自定义颜色突出显示JTextPane: 用户还能够以普通的方式用光标突出显示文本。 而且
我需要创建一个接受字符串输入的程序,并将突出显示我的字符串列表中的某些单词。 示例: 如果输入文本没有任何新行或转义字符,我没有问题,但如果输入文本有新行,这就是结果。 示例: 示例输入文本: 注:大写字符表示高亮字符 我的高亮显示示例代码: 我想问题出在换行符或转义符上,但是我找不到解决它的方法。 如果输入字符串有新行/s,如何获得单词的正确起始偏移量? 知道吗?
我想根据用户需要将我写的文本(和字体颜色)更改为另一种颜色。 我制作了一个JFrame,并添加了JTextPane。在文本窗格的右侧,我有一个不同颜色的列表(“白色”、“黑色”、“绿色”等)。Jframe还有一个JMenuBar,如果用户突出显示列表中的一个元素(比如黑色),我想更改textpane的背景色(我知道这很愚蠢,但这是老师的作业) 问题是,文本是黑色的,所以当我改变背景颜色时,文本“消
问题内容: 我有一个JTextPane(或JEditorPane,我可以使用两个都没问题)。如何将选定区域的字体更改为特定字体? 将无法正常工作。(即使是字体家族) 问题答案: 您只能整体更改JTextPane的字体,而不能更改RTF文本。 有一个下面的JEditorPane(显然的JTextPane太),你得到的与保持。您希望将其转换为a ,然后可以对给定的字符序列进行操作。 Java教程h
问题内容: 我试图 建立一个解释器,所以我想知道如何 实时更改文本的颜色。例如,我在文本字段中输入的单词是: 几秒钟后,单词变成绿色。 可能吗? 问题答案: package test;