jTextArea перестает отображать выделение текста после потери фокуса

Когда мой jTextArea находится в фокусе, он позволяет выделять текст, но не показывает выделение текста, когда теряет фокус. Можно ли продолжать отображать подсветку текста, даже если пользователь перемещает фокус на другой компонент в соответствующем jFrame?


person user2689323    schedule 16.08.2013    source источник
comment
Чтобы быстрее получить помощь, опубликуйте свой код как SSCCE, демонстрирующий вашу проблему. Это позволяет пользователям копировать/вставлять и воспроизводить вашу проблему.   -  person Duncan Jones    schedule 16.08.2013
comment
Думаю можно, но не со стандартно включенными виджетами. Для этого вам придется написать подкласс JTextArea.   -  person 11684    schedule 16.08.2013


Ответы (2)


но не показывает выделение текста, когда теряет фокус.

есть три способа:

введите здесь описание изображения

  • или программно переопределить Highlighter

введите здесь описание изображения

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;

public class MultiHighlight implements ActionListener {

    private JTextComponent comp;
    private String charsToHighlight;

    public MultiHighlight(JTextComponent c, String chars) {
        comp = c;
        charsToHighlight = chars;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Highlighter h = comp.getHighlighter();
        h.removeAllHighlights();
        String text = comp.getText().toUpperCase();
        for (int j = 0; j < text.length(); j += 1) {
            char ch = text.charAt(j);
            if (charsToHighlight.indexOf(ch) >= 0) {
                try {
                    h.addHighlight(j, j + 1, DefaultHighlighter.DefaultPainter);
                } catch (BadLocationException ble) {
                }
            }
        }
    }

    public static void main(String args[]) {
        final JFrame frame = new JFrame("MultiHighlight");
        frame.add(new JTextField("Another focusable JComponents"), BorderLayout.NORTH);
        JTextArea area = new JTextArea(10, 20);
        area.setText("This is the story\nof the hare who\nlost his spectacles."
                + "\nThis is the story\nof the hare who\nlost his spectacles.");
        frame.getContentPane().add(new JScrollPane(area), BorderLayout.CENTER);
        JButton b = new JButton("Highlight All Vowels");
        b.addActionListener(new MultiHighlight(area, "aeiouAEIOU"));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(b, BorderLayout.SOUTH);
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
person mKorbel    schedule 16.08.2013

Одним из простых обходных путей для выбора каретки является простое подклассирование DefaultCaret:

textArea.setCaret(new DefaultCaret() {
   @Override
   public void setSelectionVisible(boolean visible) {
      super.setSelectionVisible(true);
   }
});
person bobby_light    schedule 16.08.2013
comment
Это сработало отлично. Просто нужно, чтобы подсветка оставалась после потери фокуса. - person Nestor Ledon; 14.02.2016