【问题标题】:Highlighting for programmer but not user为程序员而不是用户突出显示
【发布时间】:2013-03-07 10:18:24
【问题描述】:

我正在制作一个程序,我需要能够通过我的代码编辑JTextArea 的突出显示功能,但我不希望用户能够通过鼠标突出显示。那,或者我需要一些能够手动在JTextArea 上绘画的方法(看起来像突出显示)。

我还没有任何代码明智的做法,因为我不知道如何实现它。

编辑:我知道如何在文本上绘画,但我需要绘画像高亮一样透明。

【问题讨论】:

标签: java swing jtextarea highlighting caret


【解决方案1】:

您可以从这段代码开始。它在String findstr 中找到用户给出的单词,并在整个文本区域中突出显示该单词。 您可以使用它在文本区域中多次查找并突出显示某个单词,直到它到达文本区域内容的末尾。

String findstr = findTextField.getText().toUpperCase(); // User Input Word to find
int findstrLength = findstr.length();                   
String findtextarea = textarea.getText().toUpperCase(); // TextArea Content
Highlighter h = textarea.getHighlighter();
h.removeAllHighlights();
try
    {
        int index=0;
         while(index>=0) {
        index = findtextarea.indexOf(findstr,index);
        if (index > 0) {
           h.addHighlight(index,index+findstrLength, DefaultHighlighter.DefaultPainter);
        }
        index++; // try adding this to allow you to look for the next index.
    }
    }

【讨论】:

    【解决方案2】:

    我不希望用户能够通过鼠标突出显示

    这被称为“选择”。您可以使用自定义插入符号在文本组件上禁用此功能:

    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();
                }
            });
        }
    }
    

    【讨论】:

      【解决方案3】:

      查看Highlighter.HighlightPainter 界面,很容易(有问题),允许您更改突出显示的外观。

      有一些具体的实现,但你可以定义自己的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多