2011-09-14 10 views
4

실제로 JFormattedTextField (또는 JTextComponent, 실제로는) 필드의 실제 "텍스트"주위에 접두어와 접미사가 표시되는 경우를 생각해보십시오.JTextField/JTextComponent에서 제한적으로 선택 되었습니까?

예를 들어 이중 3.5는 "$ 3.50"이라는 표시 텍스트에 대해 접두사 "$"와 접미사 ""가 될 "3.50"문자열 (서식 지정을 통해)이됩니다.

분명히 간단합니다. 그러나 접두사/접미사 내에서 텍스트를 선택할 수 있으므로 접두어/접미사의 일부 또는 전부를 삭제할 수 있습니다. 접두사/접미사를 전혀 선택할 수 없도록 사용자를 제한하는 것을 선호합니다 (텍스트 필드의 일부인 동시에 JLabel이 없어도 됨). 나는 C-a가 전체 필드를 선택하지 못하도록하는 CaretListener (또는 setCaretPosition/moveCaretPosition을 재정 의하여)를 수행하고 화살표 키를 사용하여 접두어/접미사로 이동하는 것을 방지합니다. 그러나 마우스 드래그 및 Shift-Arrow 키를 사용하여 선택 영역을 제한된 영역으로 이동할 수 있습니다.

아이디어가 있으십니까?

답변

6

이 경우 NavigationFilter를 사용할 수 있습니다. 나는 이것이의 JFormattedTextField가 작동하는 방법이라고 생각

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

public class NavigationFilterPrefixWithBackspace extends NavigationFilter 
{ 
    private int prefixLength; 
    private Action deletePrevious; 

    public NavigationFilterPrefixWithBackspace(int prefixLength, JTextComponent component) 
    { 
     this.prefixLength = prefixLength; 
     deletePrevious = component.getActionMap().get("delete-previous"); 
     component.getActionMap().put("delete-previous", new BackspaceAction()); 
     component.setCaretPosition(prefixLength); 
    } 

    public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) 
    { 
     fb.setDot(Math.max(dot, prefixLength), bias); 
    } 

    public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) 
    { 
     fb.moveDot(Math.max(dot, prefixLength), bias); 
    } 

    class BackspaceAction extends AbstractAction 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      JTextComponent component = (JTextComponent)e.getSource(); 

      if (component.getCaretPosition() > prefixLength) 
      { 
       deletePrevious.actionPerformed(null); 
      } 
     } 
    } 

    public static void main(String args[]) throws Exception { 

     JTextField textField = new JTextField("Prefix_", 20); 
     textField.setNavigationFilter(new NavigationFilterPrefixWithBackspace(7, textField)); 

     JFrame frame = new JFrame("Navigation Filter Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(textField); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

: 여기

당신이 시작하는 예입니다. 그래서 당신이 포맷 된 텍스트 필드와 함께 이것을 사용할 수 있는지는 확실치 않습니다. 기본 동작을 바꿀 수 있습니다.

+0

답변 해 주신 데 대해 감사드립니다. NavigationFilters는 분명히 정확한 해결책입니다. 서식 첨부 텍스트 필드에 대해서는, AbstractFormatter에는 그 필드의 1 개 (살)을 필드에 적용하는 override 가능한 getNavigationFilter()가 있습니다. 그게 내가 원하는 것일거야. –

관련 문제