[Java] CaretListener - usunięcie zaznaczenia

0

Pomysł jest taki, żeby usuwać zaznaczanie tekstu (selection) z komponentu JTextPane.
Pomocny może być CaretListener, jednak natknąłem się na problem ...

        JTextPane textPane = new JTextPane();
        CaretListener listener = new CaretListener() {
            public void caretUpdate(CaretEvent caretEvent) {
            	textPane.setSelectionStart(0);
            	textPane.setSelectionEnd(0);
            }
          };

          textPane.addCaretListener(listener); 

I tutaj napotykam błędy:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.util.IdentityHashMap.maskNull(Unknown Source)
at java.util.IdentityHashMap.get(Unknown Source)
at javax.swing.RepaintManager.extendDirtyRegion(Unknown Source)
at javax.swing.RepaintManager.addDirtyRegion0(Unknown Source)
at javax.swing.RepaintManager.addDirtyRegion(Unknown Source)
at javax.swing.JComponent.repaint(Unknown Source)
at java.awt.Component.repaint(Unknown Source)
at javax.swing.text.DefaultCaret.repaint(Unknown Source)
at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.JTextComponent.setCaretPosition(Unknown Source)
at javax.swing.text.JTextComponent.select(Unknown Source)
at javax.swing.text.JTextComponent.setSelectionStart(Unknown Source)
(...)

Jak to rozwiązać?

0

Przed
<java=code>
textPane.setSelectionStart(0);
textPane.setSelectionEnd(0);

zapamiętaj położenie karetki (kursora), a po wróć w zapamiętane miejsce.
0

Niestety to nie rozwiązuje problemu...

 
        CaretListener listener = new CaretListener() {
            public void caretUpdate(CaretEvent caretEvent) {
            	Caret c = textPane.getCaret();
            	textPane.setSelectionStart(0);
            	textPane.setSelectionEnd(1);
            	textPane.setCaret(c);
            	
            }
          };

          textPane.addCaretListener(listener);

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at javax.swing.text.DefaultCaret.repaint(Unknown Source)
at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.JTextComponent.setCaretPosition(Unknown Source)
at javax.swing.text.JTextComponent.select(Unknown Source)
at javax.swing.text.JTextComponent.setSelectionStart(Unknown Source)
...

0

Metody w caretUpdate() wołają caretUpdate(). Pewnie by zadziałało, jakbyś usunął tego listenera przed setSelection..., a dodał po. Ale to raczej prymitywny sposób.

0

Zapamiętaj pozycję kursora, a nie kursor.

    getCaretPosition();
    ....
0

Faktycznie, ale niestety to nie rozwiązuje problemu ...

        CaretListener listener = new CaretListener() {
            public void caretUpdate(CaretEvent caretEvent) {
            	int c = textPane.getCaretPosition();
            	textPane.setSelectionStart(0);
            	textPane.setSelectionEnd(1);
            	textPane.setCaretPosition(c);
            	
            }
          };

          textPane.addCaretListener(listener);

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.util.IdentityHashMap.hash(Unknown Source)
at java.util.IdentityHashMap.get(Unknown Source)
at javax.swing.RepaintManager.extendDirtyRegion(Unknown Source)
at javax.swing.RepaintManager.addDirtyRegion0(Unknown Source)
at javax.swing.RepaintManager.addDirtyRegion(Unknown Source)
at javax.swing.JComponent.repaint(Unknown Source)
at java.awt.Component.repaint(Unknown Source)
at javax.swing.text.DefaultCaret.repaint(Unknown Source)
at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.JTextComponent.setCaretPosition(Unknown Source)
at javax.swing.text.JTextComponent.select(Unknown Source)
at javax.swing.text.JTextComponent.setSelectionStart(Unknown Source)
at ReceivingPanel$1.caretUpdate(ReceivingPanel.java:34)
at javax.swing.text.JTextComponent.fireCaretUpdate(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.fire(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.stateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.fireStateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.JTextComponent.setCaretPosition(Unknown Source)
at javax.swing.text.JTextComponent.select(Unknown Source)
at javax.swing.text.JTextComponent.setSelectionStart(Unknown Source)
at ReceivingPanel$1.caretUpdate(ReceivingPanel.java:34)
at javax.swing.text.JTextComponent.fireCaretUpdate(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.fire(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.stateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.fireStateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.JTextComponent.setCaretPosition(Unknown Source)
at javax.swing.text.JTextComponent.select(Unknown Source)
at javax.swing.text.JTextComponent.setSelectionStart(Unknown Source)
at ReceivingPanel$1.caretUpdate(ReceivingPanel.java:34)
at javax.swing.text.JTextComponent.fireCaretUpdate(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.fire(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.stateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.fireStateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.JTextComponent.setCaretPosition(Unknown Source)
at javax.swing.text.JTextComponent.select(Unknown Source)
at javax.swing.text.JTextComponent.setSelectionStart(Unknown Source)
at ReceivingPanel$1.caretUpdate(ReceivingPanel.java:34)
at javax.swing.text.JTextComponent.fireCaretUpdate(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.fire(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.stateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.fireStateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.JTextComponent.setCaretPosition(Unknown Source)
at javax.swing.text.JTextComponent.select(Unknown Source)
at javax.swing.text.JTextComponent.setSelectionStart(Unknown Source)
at ReceivingPanel$1.caretUpdate(ReceivingPanel.java:34)
at javax.swing.text.JTextComponent.fireCaretUpdate(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.fire(Unknown Source)
at javax.swing.text.JTextComponent$MutableCaretEvent.stateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.fireStateChanged(Unknown Source)
at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.JTextComponent.setCaretPosition(Unknown Source)
at javax.swing.text.JTextComponent.select(Unknown Source)
at javax.swing.text.JTextComponent.setSelectionStart(Unknown Source)

0

Poeksperymentowałem.

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

public class Schowek extends JFrame implements KeyListener
{
    JTextArea ta;
    //------------------------
    public static void main(String[] args)
    {
        new Schowek();
    }
    //------------------------
    public Schowek()
    {
        super("Test schowka");
        ta=new JTextArea(10,60);
        add(ta);
        ta.setSelectionColor(Color.WHITE);
        ta.addKeyListener(this);
        pack();
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
    //------------------------
    public void keyTyped(KeyEvent e)
    {
    }
    //------------------------
    public void keyReleased(KeyEvent e)
    {
        ta.setSelectionEnd(0);
    }
    //------------------------
    public void keyPressed(KeyEvent e)
    {
        ta.setSelectionEnd(0);
    }
}                                                                             

1 użytkowników online, w tym zalogowanych: 0, gości: 1