Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 控制JTextPane中的属性更改_Java_User Interface_Attributes - Fatal编程技术网

Java 控制JTextPane中的属性更改

Java 控制JTextPane中的属性更改,java,user-interface,attributes,Java,User Interface,Attributes,我需要让用户有可能改变按钮点击文本的颜色。当有选择时,这很好-文本将改变其颜色。但是,当选择长度为0时,当我只有插入符号时,不会更改任何内容,这是完全正常的 然而,用户会期望在点击按钮后在该位置键入的下一个字符会改变颜色,但这不会发生 请尝试打开MS Word文档,键入一些文本,然后在Word之前或之后单击。不要点击单词本身。现在更改文本的颜色-不会发生任何事情(可见)。继续键入-键入文本的颜色是您将其更改为的颜色 现在尝试对下面的程序执行同样的操作,颜色不会改变。我怎样才能做到 为了您的方便,

我需要让用户有可能改变按钮点击文本的颜色。当有选择时,这很好-文本将改变其颜色。但是,当选择长度为0时,当我只有插入符号时,不会更改任何内容,这是完全正常的

然而,用户会期望在点击按钮后在该位置键入的下一个字符会改变颜色,但这不会发生

请尝试打开MS Word文档,键入一些文本,然后在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教程中的部分,以获得一个可以满足您需要的工作演示。这是编辑器工具包中的默认操作按您期望的方式工作。因此,我建议您查看
StyledEditorKit
的源代码,并查看
BoldAction
,了解应该如何做到这一点

我从未使用过StyleContext,所以我不确定它们是如何工作的。我使用SimpleAttributeSet,类似于:

SimpleAttributeSet red = new SimpleAttributeSet();
StyleConstants.setForeground(red, Color.RED);
MutableAttributeSet inputAttr = textPane.getInputAttributes();
inputAttr.addAttributes(red);
然后要更改属性,我将使用:

textPane.getStyledDocument().setCharacterAttributes(??, ??, red, false);
现在,这是我以前没有做过的部分,但基本上您也需要更改“输入属性”。我认为代码类似于:

SimpleAttributeSet red = new SimpleAttributeSet();
StyleConstants.setForeground(red, Color.RED);
MutableAttributeSet inputAttr = textPane.getInputAttributes();
inputAttr.addAttributes(red);

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

为了您的方便,这里有一个SSCCE
-如果您在几个小时前发布带有原始问题的SSCCE,会更方便。您在论坛中提出了足够多的问题,知道SSCCE应该与您的所有问题一起发布,以显示您在遇到问题时正在做什么。