2014-01-07 41 views
2

我想在用户通过表单中的JTextFields和JSpinners选项卡时实现自动选择。为此,我正在使用这个Listener:JSpinner:自动选择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();应该被裹进invokeLater,一切都与 Focus是相当异步(多在甲骨文教程How to use Focus, FocusSubsystem),

  • 然后invokeLater(在所有情况下都JComponents不是真实的,但 默认)for 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(); 
     } 
    }; 
}