gpt4 book ai didi

java - 控制 JTextPane 中的属性更改

转载 作者:行者123 更新时间:2023-12-01 13:51:56 26 4
gpt4 key购买 nike

我需要让用户可以在单击按钮时更改文本颜色。当有选择时这很好 - 文本会改变它的颜色。然而,当选择长度为0时,当我只有插入符号时,什么都不会改变,这是完全正常的。

但是,用户会期望在单击按钮后在该位置输入的下一个字符将改变颜色,但这种情况不会发生。

尝试打开 MS Word 文档,键入一些文本,然后单击单词之前或之后。不要在单词本身内单击。现在更改文本的颜色 - 什么(可见)都不会发生。继续键入 - 键入文本的颜色是您更改的颜色。

现在尝试对下面的程序执行相同的操作,颜色不会改变。我怎样才能实现它?

为了方便起见,这里有一个 SSCCE,但它只是普通的 Java 7,没有特殊的东西:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;


public class Main
{
public static void main(String[] args)
{
JFrame a = new JFrame("Test");
a.setSize(600, 900);
a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
a.getContentPane().setLayout(new BoxLayout(a.getContentPane(), BoxLayout.Y_AXIS));

final JTextPane b = new JTextPane();
b.addFocusListener(new FocusListener()
{
@Override
public void focusGained(FocusEvent arg0)
{
b.repaint();
}

@Override
public void focusLost(FocusEvent arg0)
{
b.repaint();
}
});

StyleContext context = new StyleContext();
final Style styleA = context.addStyle("A", null);
final Style styleB = context.addStyle("B", null);


StyleConstants.setForeground(styleA, Color.BLUE);
StyleConstants.setForeground(styleB, Color.RED);

try
{
b.getStyledDocument().insertString(0, "blablablablabla", styleA);
}

catch (BadLocationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

JButton c = new JButton("click me");
c.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
b.getStyledDocument().setCharacterAttributes(b.getSelectionStart(), b.getSelectionEnd() - b.getSelectionStart(), styleB, true);
b.grabFocus();
}
});

a.getContentPane().add(b);
a.getContentPane().add(c);

a.setVisible(true);
}
}

最佳答案

阅读 Swing 教程中关于 Text Component Features 的部分一个可以做你想要的工作的演示。这是编辑器工具包中的默认操作按照您期望的方式工作。因此,我建议您查看 StyledEditorKit 的源代码并查看 BoldAction 以了解如何完成此操作。

我从未使用过 StyleContext,所以我不太确定它们是如何工作的。我使用 SimpleAttributSet,例如:

SimpleAttributeSet red = new SimpleAttributeSet();
StyleConstants.setForeground(red, Color.RED);

然后更改我将使用的属性:

textPane.getStyledDocument().setCharacterAttributes(??, ??, red, false);

现在,这是我之前没有做过的部分,但基本上您还需要更改“输入属性”。我认为代码是这样的:

MutableAttributeSet inputAttr = textPane.getInputAttributes();
inputAttr.addAttributes(red);

再次检查 StyledEditorKit 中的源代码(我简化了代码,因此可能不准确)。

关于java - 控制 JTextPane 中的属性更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19897449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com