我需要让用户在点击按钮时更改文本颜色。选择时这很好 - 文本会改变它的颜色。但是当选择长度为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);
}
}
答案 0 :(得分:1)
阅读Text Component Features上Swing教程中的部分,了解您想要的工作演示。这是编辑器工具包中的默认操作,就像您期望的那样。因此,我建议您查看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中的源代码(我简化了代码,因此可能不准确)。