« JTextComponent の undo | トップページ | BasicInfoInspecter の表示 »

2017年1月14日 (土)

フォーカス処理の見直し

文書入力の際に,フォーカス処理はとても重要で,ウインドウが開いたらすぐに必要な場所に入力できないとかなりストレスがたまる。今まで,気がついたときに色々フォーカス処理()を加えてきたのだが,行き当たりばったりで組み込んできたので,どこでどのようなフォーカス処理をしているのか把握できなくなってしまっていた。フォーカスの取り合い?かもしれない動作が見られるようにもなっていたので,フォーカス処理を全部見直しすることにした。フォーカスは Focuser というクラスを使って,必ずここにフォーカス請求するようにリファクタリングした。案の定,不要なフォーカス請求をかなり入れてしまっていることが判明して,すっきりさせることができた。
package open.dolphin.ui;

import java.awt.Component;
import java.awt.KeyboardFocusManager;
import javax.swing.SwingUtilities;
import org.apache.log4j.Logger;

public class Focuser {
    private static final Logger logger = Logger.getLogger(Focuser.class);
    private static Component component;

    public static void requestFocus(Component c) {
        component = c;
        KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
        SwingUtilities.invokeLater(Focuser::request);
    }

    private static void request() {
        boolean result = component.requestFocusInWindow();
        logger.info(component.getClass().toString() + ": request focus " + ((result)? "succeeded" : "failed"));
    }
}

« JTextComponent の undo | トップページ | BasicInfoInspecter の表示 »

OpenDolphin」カテゴリの記事