2013-08-14 1 views
3
  • 캐럿에 문제가 있습니다. 포커스가 없으면 깜박이지 않았습니다. 스윙 액션의 코드를 참조하십시오. JTextField 및 1 등 뒤로.대체하는 방법 DefaultCaret # setBlinkRate()

  • JTextField를

    우선 사용해, DefaultCaret # setBlinkRate()가 제대로

  • 기본적으로 (재정 캐럿없이) 캐럿이 문서의 끝 부분이며, 1 일에 점멸하는 방법에 대해 설명합니다.



내 SSCCE는

import java.awt.*; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 
import javax.swing.text.DefaultCaret; 
import javax.swing.text.DefaultHighlighter; 
import javax.swing.text.Highlighter; 

public class TestTextComponents { 

    private static final long serialVersionUID = 1L; 
    private Timer timer; 
    private JTextField jTextField0 = new JTextField(); 
    private JTextField jTextField1 = new JTextField(); 
    private JTextField jTextField2 = new JTextField(); 
    private JFrame frame = new JFrame("Default Caret"); 
    private JPanel panel = new JPanel(); 

    public TestTextComponents() { 
     jTextField0.setText("jTextField0"); 
     jTextField1.setText("jTextField1"); 
     jTextField2.setText("jTextField2"); 
     jTextField1.setCaret(new HighlightCaret()); 
     jTextField2.setCaret(new HighlightCaret()); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     panel.add(new JLabel("Please skip between text fields and watch persistent selection: ")); 
     panel.add(jTextField0); 
     panel.add(jTextField1); 
     panel.add(jTextField2); 
     frame.add(panel); 
     frame.setTitle("Text component persistent selection"); 
     frame.pack(); 
     frame.setVisible(true); 
     /*timer = new javax.swing.Timer(250, updateCol()); 
     timer.setRepeats(false); 
     timer.start();*/ 
    } 

    private Action updateCol() { 
     return new AbstractAction("Hello World") { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       jTextField2.grabFocus(); 
       jTextField2.requestFocusInWindow(); 
       jTextField1.grabFocus(); 
       jTextField1.requestFocusInWindow(); 
      } 
     }; 
    } 

    private class HighlightCaret extends DefaultCaret { 

     private static final long serialVersionUID = 1L; 
     private final Highlighter.HighlightPainter unfocusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED); 
     private final Highlighter.HighlightPainter focusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE); 
     private boolean isFocused; 

     @Override 
     protected Highlighter.HighlightPainter getSelectionPainter() { 
      return isFocused ? focusedPainter /*super.getSelectionPainter()*/ : unfocusedPainter; 
     } 

     @Override 
     public void setSelectionVisible(boolean hasFocus) { 
      super.repaint(); 
      super.setBlinkRate(500); 
      if (hasFocus != isFocused) { 
       isFocused = hasFocus; 
       super.setSelectionVisible(false); 
       super.setSelectionVisible(true); 
      } 
     } 
    } 

    public static void main(String args[]) { 
     /*try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     try { 
      for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(laf.getName())) { 
        UIManager.setLookAndFeel(laf.getClassName()); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }*/ 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestTextComponents(); 
      } 
     }); 
    } 
} 
+1

이것은 의미가 없습니다. 포커스 캐럿은 현재 키보드 포커스가있는 텍스트 구성 요소 중 하나만 표시됩니다. IMHO는 포커스가없는 필드에 캐럿을 표시하는 것을 의미하지 않습니다. 화면에 여러 개의 캐럿이 생기고 사용자가 실제로 입력하는 문자를 혼동하게됩니다. – MadProgrammer

+1

SSCCE를 내 IDE에 복사했습니다. 이 코드를 실행할 때 어떤 행동을보고 싶은지 설명 할 수 있습니까? –

+0

나는 무슨 일이 일어나는 지 알 겠어. 이것은 TAB을 올바르게 사용할 때만 발생합니까? –

답변

2

깜박이는 캐럿이 사용해, DefaultCaret의 setVisible() 방법에 의해 제어에 나를 위해 속임수를 썼는지. 선택된 텍스트는 setSelectionVisible() 메소드에 의해 제어됩니다.

DefaultCaret의 focusGained/focusLost 메서드는이 두 가지 방법을 사용하여 캐럿의 동작을 제어합니다. focusGained에서 두 속성은 기본적으로 true로 설정됩니다. focusLost에서는 false로 설정됩니다.

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

public class SelectionCaret extends DefaultCaret 
{ 
    private final Highlighter.HighlightPainter unfocusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED); 
    private final Highlighter.HighlightPainter focusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE); 

    public SelectionCaret() 
    { 
     setBlinkRate(UIManager.getInt("TextField.caretBlinkRate")); 
    } 

    @Override 
    protected Highlighter.HighlightPainter getSelectionPainter() 
    { 
     return getComponent().hasFocus() ? focusedPainter : unfocusedPainter; 
    } 

    @Override 
    public void focusGained(FocusEvent e) 
    { 
     setSelectionVisible(false); 
     super.focusGained(e); 
    } 

    @Override 
    public void focusLost(FocusEvent e) 
    { 
     super.focusLost(e); 
     setSelectionVisible(true); 
    } 

    private static void createAndShowUI() 
    { 
     JTextField textField1 = new JTextField("Text Field1 "); 
     JTextField textField2 = new JTextField("Text Field2 "); 
     JTextField textField3 = new JTextField("Non Editable "); 
     textField3.setEditable(false); 

     textField1.setCaret(new SelectionCaret()); 
     textField2.setCaret(new SelectionCaret()); 
     textField3.setCaret(new SelectionCaret()); 

     textField1.select(5, 11); 
     textField2.select(5, 11); 
     textField3.select(5, 11); 
     ((DefaultCaret)textField1.getCaret()).setSelectionVisible(true); 
     ((DefaultCaret)textField2.getCaret()).setSelectionVisible(true); 
     ((DefaultCaret)textField3.getCaret()).setSelectionVisible(true); 

     JPanel north = new JPanel(); 
     north.add(new JTextField("Text Field0 ")); 
     north.add(textField1); 
     north.add(textField2); 
     north.add(textField3); 

     JFrame frame = new JFrame("Selection Caret"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(north); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

지금 텍스트는 모두 텍스트 필드에서 선택됩니다 만, 초점 만 텍스트 필드가 깜박 : 다른 형광펜을위한 기본적인 논리를 사용하면 같은 일을 할 수 있습니다. setBlinkRate(500);HighlightCaret 클래스 생성자에 배치되는 경우

+0

+1 감사합니다 .... – mKorbel

2

나는 해결책을 발견했다. HighlightCaretfocusGained 메소드를 재정의하고 거기에서도 깜박임 속도를 설정하십시오.

@Override 
    public void focusGained(FocusEvent e) 
    { 
     isFocused = true; 
     super.setBlinkRate(500); 
     super.focusGained(e); 
    } 

은 OS X의

+0

Java 6, 'AquaLookAndFeel'에서 확인되었습니다. – trashgod

+0

+1 감사합니다. 이제 형광펜이 2 위에 올랐습니다. 선택 – mKorbel

1

하지만 당신의 previous code 확인을 작동합니다

class HighlightCaret extends DefaultCaret { 

    private static final Highlighter.HighlightPainter unfocusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED); 
    private static final Highlighter.HighlightPainter focusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 
    private static final long serialVersionUID = 1L; 
    private boolean isFocused; 

    HighlightCaret(){ 
    setBlinkRate(500);//Placed here 
    } 

    @Override 
    protected Highlighter.HighlightPainter getSelectionPainter() { 
     // setBlinkRate(500); // otherwise is disabled, stopped 
     return isFocused ? focusedPainter/*super.getSelectionPainter()*/ : unfocusedPainter; 
    } 

    @Override 
    public void setSelectionVisible(boolean hasFocus) { 
     if (hasFocus != isFocused) { 
      isFocused = hasFocus; 
      super.setSelectionVisible(false); 
      super.setSelectionVisible(true); 
     } 
    } 
} 

는 Java7 WINXP에서 테스트. 너 해봤 어?

+0

+1, 내가 더 설명하고 싶습니다. 나는이 과정을 제어하고 싶습니다. 이제는 @camickr의 L & F에 민감하지 않습니다. 그의 해결 방법은 매우 안전합니다. (StanislavL) 여기서 중요한 답변이 누락 된 경우이 게시물에 댓글을 달 것입니다. – mKorbel

+0

깜박이는 캐럿은 setGisible() 및 focusGained/focusLost의 managable에 의해 제어됩니다.이 정보는 내가 알아야 할 정보입니다 ... – mKorbel