Phạm Quốc Bảo
Phạm Quốc Bảo

Reputation: 894

How to disable text selection on JTextArea Swing

I don't want the user to select the content on JTextArea. I use setEditable(false) but it's not working. How to disable this feature of JTextArea component. Could you give me advise. Thanks.

enter image description here

Upvotes: 5

Views: 9698

Answers (3)

Stanimir
Stanimir

Reputation: 196

Late to the party, but here are my findings. I had tried using setEnabled(false) on a JTextPane displaying static (not user-modifiable) content such as line numbers (for another text component). This one alone prevents the component from getting focus and text selection on it:

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

My problem with setEnabled(false) is that it forces a single disabledTextColor for all of the text (I've traced it down to javax.swing.text.GlyphView.paint()), while I want to style individual lines/chunks. I've finally tried setFocusable(false) that appears to satisfy both needs:

  • Not user focusable and no user selection on it;
  • Custom text color could be applied to individual parts of the content, or it just doesn't change the text color to the disabled one.

The complete solution needs additional setEditable(false) to prevent the mouse cursor from changing but that's it – two properties:

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

Upvotes: 2

user6139543
user6139543

Reputation:

If you would like to just disable text selection on any swing control such as JtextArea you can use the coding below:

JtextArea.setHighlighter(null);

This one line of coding will help disable the text selection and can be placed in the constructor or within a initialized method upon Frame execution.

Hope this helps

Upvotes: 8

camickr
camickr

Reputation: 324197

You can set the "mark" equal to the "dot" of the caret. When these values are equal there is no text selection:

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

Upvotes: 7

Related Questions