2014-06-21 7 views
1

패널의 여러 텍스트 필드 각각에 가운데 맞춤을 적용하고 포커스를 얻었을 때 전체 필드를 선택하는 포커스 수신기를 갖기를 원합니다. 여러 텍스트 필드에서 포커스를 가져올 때 전체 텍스트를 선택합니다.

txtSelection = new JTextField("", 9); 
txtInclusion = new JTextField("", 9); 
txtExclusion = new JTextField("", 9); 
... 

나는 하나 그것을 하나를 수행하는 방법을 알고 :

txtSelection.setHorizontalAlignment(JTextField.CENTER); 

txtSelection.addFocusListener(new FocusAdapter() { 

    public void focusGained(FocusEvent e) { 

    txtSelection.select(0, 9); 
    } 
}); 

그러나 는 차라리 모든 텍스트 필드에 그 구조를 반복하지 것입니다.

나는이 시도 (및 품종의 커플)하지만 코드는 아무것도 할 수없는 것 :

pnlConditions = new JPanel(); 
pnlConditions.setLayout(new GridBagLayout()); 

for(final Component c : pnlConditions.getComponents()) // compiler insisted on 'final' 
{ 
    ((JTextField)c).setHorizontalAlignment(JTextField.CENTER); 

    if(c instanceof JTextField) 
    { 
    c.addFocusListener 
     (new FocusAdapter() 
     { 
      @Override public void focusGained(FocusEvent e) 
      { 
      ((JTextField)c).select(0,9); // compiler suggested cast to JTextComponent; no difference 
      } 
     } 
    ); 
    } 
} 

는 전체 필드가 ​​선택되지 않습니다; 정렬이 그대로 유지됩니다 (기본값). 컴파일러가 cforfinal이어야하고 그 캐스트는 select과 같은 진술로 JTextComponent에 있어야한다고 주장하고 있습니다. 그러나 그 진술에 대한 제안은 setHorizontal...으로하지 않았다.

이 작업을 수행 할 수 있습니다. 그러나 어떻게?


여기서 위의 조각을 포함하는 전체 방법의 첫째는 빈 배열을 반환 JPanel 그렇지 pnlConditions.getComponents()에 구성 요소를 추가

static void makePnlConditions(){ 
    JLabel lblSelections = new JLabel("Select ONLY combos with ALL of:"); 
    JLabel lblInclusions = new JLabel("DE-select combo NOT containing one or more of:"); 
    JLabel lblExclusions = new JLabel("DE-select combo containing ANY of:"); 

    txtSelection = new JTextField("", 9); 
    txtInclusion = new JTextField("", 9); 
    txtExclusion = new JTextField("", 9); 

    pnlConditions = new JPanel(); 
    pnlConditions.setLayout(new GridBagLayout()); 

    for(final Component c : pnlConditions.getComponents()) 
    { 
     ((JTextField)c).setHorizontalAlignment(JTextField.CENTER); 

     if(c instanceof JTextField) 
     { 
     c.addFocusListener 
      (new FocusAdapter() 
      { 
       @Override public void focusGained(FocusEvent e) 
       { 
       ((JTextField)c).select(0,9); 
       } 
      } 
     ); 
     } 
    } 

    pnlConditions.add(lblSelections); 
    pnlConditions.add(txtSelection); 
    pnlConditions.add(lblInclusions); 
    pnlConditions.add(txtInclusion); 
    pnlConditions.add(lblExclusions); 
    pnlConditions.add(txtExclusion); 
    } 

답변

2

더 리스너 JTextField 첨가되지 않는다.

전체 텍스트를 선택하려면 JTextComponent#selectAll() 메서드를 사용하십시오.

샘플 코드 :

JPanel pnlConditions = new JPanel(); 
pnlConditions.setLayout(new GridBagLayout()); 

pnlConditions.add(lblSelections); 
pnlConditions.add(txtSelection); 
pnlConditions.add(lblInclusions); 
pnlConditions.add(txtInclusion); 
pnlConditions.add(lblExclusions); 
pnlConditions.add(txtExclusion); 

for (final Component c : pnlConditions.getComponents()) {  
    if (c instanceof JTextField) { 
     ((JTextField) c).setHorizontalAlignment(JTextField.CENTER); 
     ... 
    } 
} 

나는 중앙 정렬을하고 포커스를 얻은 경우 전체 필드를 선택하는 포커스 청취자를 가지고 패널에 여러 텍스트 필드의 각을 원한다.

JTextField까지 확장되는 사용자 정의 클래스를 만들고 모든 기본 구현을 제공하고 응용 프로그램의 모든 곳에서 사용하여 중앙 집중식으로 만듭니다.

샘플 코드 :

class MyJTextField extends JTextField { 

    // Initialization block that is called for all the constructors 
    { 
     this.addFocusListener(new FocusAdapter() { 
      @Override 
      public void focusGained(FocusEvent e) { 
       selectAll(); 
      } 
     }); 
     this.setHorizontalAlignment(JTextField.CENTER); 
    } 

    public MyJTextField() {} 
    public MyJTextField(String text) {super(text);} 
    public MyJTextField(int columns) {super(columns);} 
    public MyJTextField(String text, int columns) {super(text, columns);} 
} 
+0

@Braj --- 감사합니다! 필드에 패널을 추가하기 전에 필드를 완료해야한다는 명백한 오해가 당신이 분명히 한 일을 못하게했습니다. 그게 전부입니다. 나는 또한 당신에게'selectAll'에 관해 나에게 조언 해 주신 점에 감사드립니다. 'select (0,9)'가 효율적이지는 않지만 작업을 수행하기는하지만 나는 그 사실도 놓쳤다. – DSlomer64

+0

@ Braj - FYI - 내가 요청한 작업을 수행하기 위해'centerAndSelect (JPanel p)'메소드를 만들었습니다. 나는이 프로그램의 두 개의 다른 장소에서 그것을 호출하고 그것을 (아마도 그것을 확장) 여기에 많이 사용하는 것, 내 생각! (JTextField 확장에 대한 답변의 두 번째 부분이 있다는 것을 깨달았습니다 ...그걸 연구해야 해.) ... (그냥 했어! COOL!) – DSlomer64

+0

네, 일반화하기위한 방법이 많이 있습니다. 1.) 공통 코드를 이동하는 별도의 메소드를 작성하십시오. 2) 제안 된대로 사용자 정의 클래스를 작성하십시오. 현재 응용 프로그램 설계 및 코딩에 따라 더 쉬운 것을 선택하십시오. – Braj