如何使用setFocusable(false)突出显示JTextPane中的文本?

时间:2016-09-30 00:07:13

标签: java swing highlight jtextpane focusable

所以我有JTextPane基本上作为控制台。我把它放在南区JFrameJTextField的中心区域。 JTextField将获取其拥有的文本,并在用户按Enter键时将其添加到JTextPane。为了使JTextPane不可由用户编辑,我必须setFocusable(false),因为使用setEditable(false)会阻止任何文字显示在JTextPane上。但是虽然我不希望用户编辑窗格,但我仍然希望用户能够在窗格中突出显示文本,但我似乎无法找到实现此目的的方法。

以下是展示我的意思的示例

示例

package resources;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.text.AttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;

public class SampeTextPane extends JFrame
{
    public SampeTextPane()
    {
        setPreferredSize(new Dimension(350, 200));
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JTextPane display = new JTextPane();
        display.setBorder(new EmptyBorder(5, 5, 5, 5));
        display.setMargin(new Insets(5, 5, 5, 5));
        display.setFocusable(false);
        appendToPane(display, "Example", Color.BLUE);

        JTextField field = new JTextField();
        field.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                appendToPane(display, field.getText(), Color.BLACK);
                field.setText("");
            }
        });

        add(display, BorderLayout.CENTER);
        add(field, BorderLayout.SOUTH);

        pack();
        setVisible(true);
    }

    private void appendToPane(JTextPane pane, String text, Color color)
    {
        StyleContext sc = StyleContext.getDefaultStyleContext();
        AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, color);

        aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED);

        int len = pane.getDocument().getLength();
        pane.setCaretPosition(len);
        pane.setCharacterAttributes(aset, false);
        pane.replaceSelection(text + "\n");
    }

    public static void main(String[] args)
    {
        new SampeTextPane();
    }
}

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

  

使用setEditable(false)阻止任何文本出现在JTextPane上。

您可以使JTextPane无法修改,但无法通过文本窗格更新文本。

相反,您可以通过Document

更新文字
//int len = pane.getDocument().getLength();
//pane.setCaretPosition(len);
//pane.setCharacterAttributes(aset, false);
//pane.replaceSelection(text + "\n");

try
{
    StyledDocument doc = pane.getStyledDocument();
    doc.insertString(doc.getLength(), text, aset);
}
catch(BadLocationException e) { System.out.println(e); }

答案 1 :(得分:3)

另一个选项,虽然更复杂,但是使用布尔标志来允许或禁止对文档进行更改,建议使用StanislavL here

在您的情况下,它可能看起来像:

git config --list