java 如何在JTextArea Swing上禁用文本选择

4ioopgfo  于 2022-11-20  发布在  Java
关注(0)|答案(3)|浏览(301)

我不希望用户选择JTextArea上的内容。我使用setEditable(false),但它不工作。如何禁用JTextArea组件的此功能。您能给予我建议吗?谢谢。

wd2eg0qa

wd2eg0qa1#

您可以将“mark”设置为与插入符号的“dot”相等。当这些值相等时,不存在文本选择:

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class NoTextSelectionCaret extends DefaultCaret
{
    public NoTextSelectionCaret(JTextComponent textComponent)
    {
        setBlinkRate( textComponent.getCaret().getBlinkRate() );
        textComponent.setHighlighter( null );
    }

    @Override
    public int getMark()
    {
        return getDot();
    }

    private static void createAndShowUI()
    {
        JTextField textField1 = new JTextField("No Text Selection Allowed");
        textField1.setCaret( new NoTextSelectionCaret( textField1 ) );
        textField1.setEditable(false);

        JTextField textField2 = new JTextField("Text Selection Allowed");

        JFrame frame = new JFrame("No Text Selection Caret");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(textField1, BorderLayout.NORTH);
        frame.add(textField2, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
btqmn9zl

btqmn9zl2#

如果您只想禁用任何swing控件(如JtextArea)上的文本选择,则可以使用以下代码:

JtextArea.setHighlighter(null);

这一行代码将帮助禁用文本选择,并可放置在构造函数中或Frame执行时初始化的方法中。
希望这对你有帮助

k97glaaz

k97glaaz3#

我已经晚了,但我发现了以下内容。我曾尝试在JTextPane上使用setEnabled(false)来显示静态(用户不可修改的)内容,如行号(用于另一个文本组件)。仅这一项就阻止了组件获得焦点和文本选择:

JTextArea textArea = new JTextArea("Static text");
        textArea.setEnabled(false);

我使用setEnabled(false)的问题是,它强制所有文本使用一个disabledTextColor(我已经将其追溯到javax.swing.text.GlyphView.paint()),而我想对单个行/块进行样式化。我最终尝试了setFocusable(false),它似乎同时满足了这两种需求:

  • 用户不可聚焦,并且没有用户选择;
  • 自定义文本颜色可以应用于内容的各个部分,或者它只是不将文本颜色更改为 * 禁用 * 的颜色。

完整的解决方案需要额外的setEditable(false)来防止鼠标光标发生变化,但仅此而已-两个属性:

JTextArea textArea = new JTextArea("Static text");
        textArea.setEditable(false);
        textArea.setFocusable(false);

相关问题