2014-01-07 2 views
2

사용자가 내 양식에서 JTextFields 및 JSpinners를 탭할 때 자동 선택을 구현하려고합니다. 이를 위해이 수신기를 사용하고 있습니다.JSpinner : autoselect onFocus

public class AutoSelect implements FocusListener { 

    @Override 
    public void focusGained(final FocusEvent e) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       if (e.getSource() instanceof JTextField) { 
        try { 
         JTextField t = (JTextField) e.getComponent(); 
         t.selectAll(); 
        } catch (ClassCastException ex) { 
         // 
        } 
       }else if (e.getSource() instanceof JSpinner){ 
        JSpinner spinner = (JSpinner)e.getComponent(); 
        JTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField(); 
        tf.selectAll(); 
       } 
      } 
     }); 
    } 

    @Override 
    public void focusLost(FocusEvent e) { 
     // 
    } 
} 

내 스피너에는 작동하지 않습니다. 이벤트가 발생했습니다. 올바른 행이 실행되고 아무 것도 발생하지 않습니다. 나는 .getTextField()를 올바르게 사용하지 않는다고 생각합니다. 누구든지이 작업 솔루션을 가지고 있습니까?

답변

4
  • tf.selectAll();Focus으로 invokeLater, 모든으로 포장되어야한다, 기본적으로

  • 모든 JComponents에 대한 모든 경우에 사실이 아니다 다음

    invokeLater (하지만 (더 오라클 튜토리얼 How to use Focus, FocusSubsystem에) 꽤 비동기) JTextComponents의 경우이 이벤트를 대기열 끝에 이동하면 이 올바르게 작동합니다.

enter image description here

enter image description here

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

public class ComboBoxTwo extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JTextField text = new JTextField(15); 
    private JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 15, 1)); 

    public ComboBoxTwo() { 
     text.setText("Something selectable"); 
     text.addFocusListener(fcsListener); 
     JFormattedTextField format = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField(); 
     // or JTextField tf = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField(); 
     format.addFocusListener(fcsListener); 
     //or tf.addFocusListener(fcsListener); // depends of type for SpinnerXxxModel 
     add(text, BorderLayout.NORTH); 
     add(spinner, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new ComboBoxTwo(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
// 
    private FocusListener fcsListener = new FocusListener() { 
     @Override 
     public void focusGained(FocusEvent e) { 
      dumpInfo(e); 
     } 

     @Override 
     public void focusLost(FocusEvent e) { 
      dumpInfo(e); 
     } 

     private void dumpInfo(FocusEvent e) { 
      System.out.println("Source : " + name(e.getComponent())); 
      System.out.println("Opposite : " + name(e.getOppositeComponent())); 
      System.out.println("Temporary: " + e.isTemporary()); 
      final Component c = e.getComponent();//works for editable JComboBox too 
      if (c instanceof JFormattedTextField) { 
       SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         ((JFormattedTextField) c).setText(((JFormattedTextField) c).getText()); 
         ((JFormattedTextField) c).selectAll(); 
        } 
       }); 
      } else if (c instanceof JTextField) { 
       SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         ((JTextField) c).setText(((JTextField) c).getText()); 
         ((JTextField) c).selectAll(); 
        } 
       }); 
      } 
     } 

     private String name(Component c) { 
      return (c == null) ? null : c.getName(); 
     } 
    }; 
}