2009-07-24 4 views
33

私はSwingを使用する小さなJavaデスクトップアプリケーションを持っています。異なるタイプの入力フィールド(JTextField、JComboBox、JSpinner、JFormattedTextField)を持つデータ入力ダイアログがあります。 JFormattedTextFieldsをフォームのタブ移動またはマウスでクリックすることでアクティブにすると、現在含まれているすべてのテキストを選択したいと思います。そうすれば、ユーザーは入力を開始してデフォルト値を上書きすることができます。JFormattedTextFieldでフォーカスを取得すると、すべてのテキストを選択するにはどうすればよいですか?

どうすればいいですか?私はJFormattedTextFieldでselectAll()を呼び出すFocusListener/FocusAdapterを使用しましたが、FocusAdapterのfocusGained()メソッドが呼び出されましたが、何も選択しません(下記のコードサンプルを参照)。

private javax.swing.JFormattedTextField pricePerLiter; 
// ... 
pricePerLiter.setFormatterFactory(
    new JFormattedTextField.AbstractFormatterFactory() { 
    private NumberFormatter formatter = null; 
    public JFormattedTextField.AbstractFormatter 
     getFormatter(JFormattedTextField jft) { 
     if (formatter == null) { 
      formatter = new NumberFormatter(new DecimalFormat("#0.000")); 
      formatter.setValueClass(Double.class); 
     } 
     return formatter; 
    } 
}); 
// ... 
pricePerLiter.addFocusListener(new java.awt.event.FocusAdapter() { 
    public void focusGained(java.awt.event.FocusEvent evt) { 
     pricePerLiter.selectAll(); 
    } 
}); 

面白いのは、少なくとも、フォームをタブで移動するときに、JTextFieldとJSpinnerのデフォルトの動作が、すべてのテキストを選択することが明らかです。

答えて

65

保留中のすべてのAWTイベントが処理された後、それはどうなるのでSwingUtilities.invokeLaterを持つあなたの呼び出しをラップ:

pricePerLiter.addFocusListener(new java.awt.event.FocusAdapter() { 
    public void focusGained(java.awt.event.FocusEvent evt) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       pricePerLiter.selectAll(); 
      } 
     }); 
    } 
}); 
+3

おかげで、それはそれです。私は、NumberFormatterがselectAll()を取り消す何かをしているとしか推測できませんか? –

+3

はい、あります。値をフォーマットし、テキストをリセットします。 –

+1

+1これが必要でした。瞬時にこのことを自分のやり方で覚えていなかったので、グーグルがすぐにこの答えを見つけました。ありがとう! –

6

ザッツのJFormattedTextFieldが焦点にフォーマットするprocessFocusEventをオーバーライドするためには、/フォーカスが失わ得ました。それはprocessFocusEventに対して呼ばれた時刻に依存するであろう、常にそれをwork..sinceいない可能性がありますのFocusListenerを使用して

new JFormattedTextField("...") { 
     protected void processFocusEvent(FocusEvent e) { 
      super.processFocusEvent(e); 
      if (e.isTemporary()) 
       return; 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        selectAll(); 
       } 
      }); 
     } 
    }; 

ワン確認ショットの方法は、のJFormattedTextFieldを拡張し、processFocusEventメソッドをオーバーライドすることです。

KeyboardFocusManager.getCurrentKeyboardFocusManager() 
    .addPropertyChangeListener("permanentFocusOwner", new PropertyChangeListener() 
{ 
    public void propertyChange(final PropertyChangeEvent e) 
    { 
     if (e.getNewValue() instanceof JTextField) 
     { 
      SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        JTextField textField = (JTextField)e.getNewValue(); 
        textField.selectAll(); 
       } 
      }); 

     } 
    } 
}); 
14

、。フォーカスがJTextFieldから別の種類のコンポーネント(ボタンなど)に渡されると、最後の自動選択はクリアされません。私はこれが古いの一種である知っている

KeyboardFocusManager.getCurrentKeyboardFocusManager() 
     .addPropertyChangeListener("permanentFocusOwner", new PropertyChangeListener() 
    { 
     @Override 
     public void propertyChange(final PropertyChangeEvent e) 
     { 

      if (e.getOldValue() instanceof JTextField) 
      { 
        SwingUtilities.invokeLater(new Runnable() 
        { 
          @Override 
          public void run() 
          { 
            JTextField oldTextField = (JTextField)e.getOldValue(); 
            oldTextField.setSelectionStart(0); 
            oldTextField.setSelectionEnd(0); 
          } 
        }); 

      } 

      if (e.getNewValue() instanceof JTextField) 
      { 
        SwingUtilities.invokeLater(new Runnable() 
        { 
          @Override 
          public void run() 
          { 
            JTextField textField = (JTextField)e.getNewValue(); 
            textField.selectAll(); 
          } 
        }); 

      } 
     } 
    }); 
2

camickrのコードが若干改善することができます:あなたはあなただけ行うことができ、すべてのテキストフィールドのためにこれをしたい場合は、上記に加えて

7

、私はinvokeLaterのないクリーンなソリューション、思い付いた:それはこのように固定することができ

private class SelectAllOfFocus extends FocusAdapter { 

    @Override 
    public void focusGained(FocusEvent e) { 
     if (! e.isTemporary()) { 
      JFormattedTextField textField = (JFormattedTextField)e.getComponent(); 
      // This is needed to put the text field in edited mode, so that its processFocusEvent doesn't 
      // do anything. Otherwise, it calls setValue, and the selection is lost. 
      textField.setText(textField.getText()); 
      textField.selectAll(); 
     } 
    } 

} 
+0

はすべてのケースで私にとって役に立ちます+1 – mKorbel

関連する問題