があり、方法などについての動作を変更するJava/スイングを制御させていただくことが重?
-
09-06-2019 - |
質問
ほとんどがGUIの使い、制御を含むテキストを取得し、コンテンツ全体の制御を選択します。この場合は無料でご利用いただけタイピングは、完全に置き換え元ます。
例:きスピンを制御することを初期化するの値がゼロになります。いタブでタイプ"1"の値を制御するには1.
Swing、これは当てはまりません。テキストをコントロールが出てきません選択され、カラットを表示一端または他の既存します。続き上記の例:
イングのJSpinnerに、タブのスピン制御、カラットで左折します。きタイプ"1"の値の制御は10です。
このドライブ、(私のユーザー、壁ていただきたいと思いますように変えることはできない。ますます重要なので、そういった変化で世界の新しい動作に適用されJTextField、JPasswordField,JFormattedTextField,JTextArea、JComboBox、JSpinnerです。のいかんを追加FocusAdapter各制御およびオーバーライドのfocusGained()メソッドこの商品につけられたタグ[tm].
いのちや、脆弱です。下さい。
編集:一つ追加の情報がこいことを証明しています。のんを使って生成されうのフォームデザイナー。これは、私が普段かびませんが、コードを書く作成します。できるかという考えを作りたい自ら行ったが、これは手間いを避けなければなりません。
をモットー:すべての良いプログラマは、基本的に踏む。
解決 4
を読んでからご回答はこれまでに(!) 私の一番外側のJPanel、以下の方法
void addTextFocusSelect(JComponent component){
if(component instanceof JTextComponent){
component.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent event) {
super.focusGained(event);
JTextComponent component = (JTextComponent)event.getComponent();
// a trick I found on JavaRanch.com
// Without this, some components don't honor selectAll
component.setText(component.getText());
component.selectAll();
}
});
}
else
{
for(Component child: component.getComponents()){
if(child instanceof JComponent){
addTextFocusSelect((JComponent) child);
}
}
}
}
本当にうまくいきます。
他のヒント
がんに必要なことは、過去に私のサブクラスの部品がたかったので"を追加した自動清算機能です。例:
public class AutoClearingTextField extends JTextField {
final FocusListener AUTO_CLEARING_LISTENER = new FocusListener(){
@Override
public void focusLost(FocusEvent e) {
//onFocusLost(e);
}
@Override
public void focusGained(FocusEvent e) {
selectAll();
}
};
public AutoClearingTextField(String string) {
super(string);
addListener();
}
private void addListener() {
addFocusListener(AUTO_CLEARING_LISTENER);
}
}
最大の問題はまだ見つかり"良い"にすべての標準のコンストラクタを書かずにオーバーライド.追加したり、強制呼addListenerは最も一般的なアプローチが記載されました。
ノイズに悩まされることもありますContainerEventsトップレベルのコンテナとContainerListeerの存在を検知する新しいウィジェットを追加するフォーカスリスナーをウィジェットが追加されています。(例:場合、コンテナイベントによる追加TextField、それがすべてのフォーカスリスナーを知っているかをすべて選択テキストテキストフィールドです。) 場合にコンテナが追加され、それに必要なものを再帰的に追加のContainerListenerる新しいサブコンテナです。
もしかしたらなmuck約フォーカスリスナーに実際のUIコードではすべて入っていますから、より高いレベル。
しかしこの自分自身のみdabbledからもできるのではないでしょうかを取得し現在ンポーネントを用い:KeyboardFocusManagerがあるstaticメソッドgetCurrentKeyboardFocusManager()) るPropertyChangeListenerを追加する。それらのライブラリの中からを見いだすことができれば、コンポーネントが含まれており、JTextComponentを選択しています。
別のクラスを付けComponentlistenerをご希望のテキストフィールドを記述することができます。全てのフォーカスリスナーの思い通話selectAll()をテキストウィジェットで利益を。
public class SelectAllListener implements FocusListener {
private static INSTANCE = new SelectAllListener();
public void focusLost(FocusEvent e) { }
public void focusGained(FocusEvent e) {
if (e.getSource() instanceof JTextComponent) {
((JTextComponent)e.getSource()).selectAll();
}
};
public static void addSelectAllListener(JTextComponent tc) {
tc.addFocusListener(INSTANCE);
}
public static void removeSelectAllListener(JTextComponent tc) {
tc.removeFocusListener(INSTANCE);
}
}
受け入れるJTextComponentの引数としてこの動作を追加できJTextArea,JPasswordFieldは、ほとんどの場合、他のすべてのテキスト編集コンポーネン。ることが可能になるので、クラスを追加を選択して編集可能なコンボボックスとJSpinnersを行う場合は、制御上のテキストエディタコンポーネントがあります。便利なメソッドで追加:
public static void addSelectAllListener(JSpinner spin) {
if (spin.getEditor() instanceof JTextComponent) {
addSelectAllListener((JTextComponent)spin.getEditor());
}
}
public static void addSelectAllListener(JComboBox combo) {
JComponent editor = combo.getEditor().getEditorComponent();
if (editor instanceof JTextComponent) {
addSelectAllListener((JTextComponent)editor);
}
}
また、リスナーを削除方法が不要になったらリスナーを含みません外部参考文献、その他のインスタンスができる追加されたコードレビュー行きがよりスムーズになりました。
みんなをComponentlistener書に添えてもかまわないのですが。ついこのComponentlistenerするグローバルに全ての部品にしたいアプリケーション性を高めることが考えられますがこで指向プログラミング(AOP).と技能コード、あるいは一度ご応募フォーカスリスナーすべての部品をインスタンスを生成アなコピー-ペーストの ます。addFocusListener(listener) コードを通して申請..
お面が切片の作成JComponentのサブク追加したいこの動き)追加のフォーカスリスナーを新しく作成されたインスタンス.のAOPアプローチはよりコピー-貼り付けのComponentlistenerを全体コードがすべて単一のコードになりませんが、保守悪夢が決まったら、変更をグローバル行動などを取り除くのリスナー JSpinners.
多くのAOPの枠組みがあります。私のように JBossAOP 以来、100%pure Javaで入手できるかもしれませんが、うち AspectJ.