量産メモ帳

忘れっぽいのでメモを残しています。

Focus イベントに関するコードサンプル。

スポンサーリンク

以下のページからソースコードを引用させていただく。ただし、コードが正しいかどうかは検証していない。

ボタンがフォーカスを取得した時、フォーカスを失ったコンポーネントが検証イベントを発送しないようにする。


/* ボタンの初期化 */
JButton button = new JButton();
//このボタンにフォーカスが遷移してもバリデーションを開始しないことを示す
button.putClientProperty("causesValidation", Boolean.FALSE);

/* フォーカス消失イベントのハンドリング */
@Override
public void focusLost(FocusEvent e) {
if (e.isTemporary()) return;

if (e.getOppositeComponent() != null) {
if (e.getOppositeComponent() instanceof JComponent) {
JComponent jc = (JComponent) e.getOppositeComponent();
if (jc.getClientProperty("causesValidation") == Boolean.FALSE) {
return; //バリデーション無し
}
}
}
// 項目バリデーションの実施処理

}


/* コンポーネントがマウスオーバーされた時にフォーカスを取得する。 */
// add a listener for mouse enter
addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent event) {
// Request the focus (if don't already have it)
if(!hasFocus()) { requestFocus(); }
}
});

/* コンポーネントが確実にフォーカスを取得できるようにする。 */
if(!hasFocus()) {
// ensure requestFocus is enabled
if(!isRequestFocusEnabled()) { setRequestFocusEnabled(true); }
requestFocus();
}

/* コンポーネントが確実にフォーカスを取得できるようにする? */
if(!hasFocus()) { grabFocus(); }

/* 次のコンポーネントにフォーカスを移す。 */
public void transferFocus();

/* フォーカスを取得/消失したら、コンポーネントの背景色を変更する。 */
// private instance variables
private boolean bFocusIndicated = false;
private Color originalColor;
.
.
.
// add a listener for focus events
addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
if(!bFocusIndicated) {
// set background to a darker color to indicate focus
originalColor = getBackground();
setBackground(originalColor.darker());
bFocusIndicated = true;
}
}
public void focusLost(FocusEvent e) {
// restore original background color
setBackground(originalColor);
bFocusIndicated = false;
}
});

/* テキストフィールドに文字を入力しない限り次のコンポーネントへのフォーカスの遷移を許可しない。 */
class MyTextField extends JTextField {
boolean validDataEntered = false;
// Constructors
public MyTextField () {
super();
init();
}
public MyTextField (String text) {
super(text);
init();
}
// Private initialization routine to be run at construct time
private void init() {
// add a key event listener that will consume tab keys until valid data entered in field
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
// look for tab keys
if(event.getKeyCode() == KeyEvent.VK_TAB || event.getKeyChar() == '\t') {
// if no valid data entered in field, consume event
// so that it won't be passed on to focus manager
if(!validDataEntered) {
event.consume();
}
} else {
// assume any key other than tab is valid data
validDataEntered = true;
}
}
});
}
// Override to inform focus manager that component is managing focus changes
public boolean isManagingFocus() { return true; }
}

以下のページは、添付のアプリケーションを動かしながら添付のソースコードを眺めた方が理解が早い。