2013-08-16 6 views
5

jTextArea에 포커스가 있으면 텍스트 강조 표시가 가능하지만 포커스가 사라지면 텍스트 선택 항목이 표시되지 않습니다. 사용자가 관련 jFrame의 다른 구성 요소로 포커스를 이동하더라도 텍스트 강조 표시를 계속 표시 할 수 있습니까?jTextArea는 포커스 손실 후 텍스트 강조 표시를 중지합니다.

+2

게시하여 자신의 문제를 보여주는 [SSCCE] (http://www.sscce.org) 코드. 이를 통해 사용자는 문제를 복사/붙여 넣기하고 재현 할 수 있습니다. –

+0

표준이 포함 된 위젯이 아닌 가능하다고 생각합니다. 이를 위해'JTextArea'의 서브 클래스를 작성해야합니다. – 11684

답변

3

그러나 포커스를 잃을 때 텍스트 선택을 표시하지 않습니다.

세 가지 방법이 있습니다 : 어떻게 재정의

enter image description here

  • 또는 프로그래밍 방식으로 우선 형광펜

enter image description here

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

캐럿 선택을위한 하나의 간단한 해결 방법은 간단한 사용해, DefaultCaret의 서브 클래스입니다 : 더 나은 도움을 빨리 들어

textArea.setCaret(new DefaultCaret() { 
    @Override 
    public void setSelectionVisible(boolean visible) { 
     super.setSelectionVisible(true); 
    } 
}); 
+0

이것은 완벽하게 작동했습니다. 초점을 잃은 후에도 강조 표시가 필요했습니다. –

관련 문제