Skip to content

Instantly share code, notes, and snippets.

@xnrghzjh
Created November 30, 2012 04:23
Show Gist options
  • Save xnrghzjh/4173762 to your computer and use it in GitHub Desktop.
Save xnrghzjh/4173762 to your computer and use it in GitHub Desktop.
Swingのフォーカス制御
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package focus;
import java.awt.Component;
import java.awt.Container;
import java.awt.FocusTraversalPolicy;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/**
* フォーカス遷移を制御するクラス
* @author
*/
public class O3FFocusTraversalPolicy extends FocusTraversalPolicy {
private List<Component> componentList = null ;
/**
* コンストラクタ
* @param componentList フォーカスインデックスを格納したリスト
*/
public O3FFocusTraversalPolicy(List<Component> componentList) {
this.componentList = componentList;
}
/**
* 保持しているコンポーネントの一覧を返す
* @return コンポーネント一覧
*/
public List<Component> getComponentList() {
return componentList;
}
/**
* コンポーネントの一覧をセットする
* @param orderList コンポーネント一覧
*/
public void setOrderList(List<Component> orderList) {
componentList = orderList;
}
/**
* 最初のコンポーネントにフォーカスをセットする<BR>
* この処理はフォーカス移動時に自動で呼ばれる
*
* @param focusCycleRoot
* @return
*/
@Override
public Component getFirstComponent(Container focusCycleRoot) {
Component component = componentList.get(0);
if (!component.isEnabled()) {
component = nextComponent(focusCycleRoot, component);
}
return component;
}
/**
* 最後のコンポーネントにフォーカスをセットする<BR>
* この処理はフォーカス移動時に自動で呼ばれる
*
* @param focusCycleRoot
* @return
*/
@Override
public Component getLastComponent(Container focusCycleRoot) {
Component component = componentList.get(componentList.size()-1);
if (!component.isEnabled()) {
component = prevComponent(focusCycleRoot, component);
}
return component;
}
/**
* 次のコンポーネントにフォーカスをセットする<BR>
* この処理はフォーカス移動時に自動で呼ばれる
*
* @param focusCycleRoot
* @param component
* @return
*/
@Override
public Component getComponentAfter(Container focusCycleRoot, Component component) {
return nextComponent(focusCycleRoot, component);
}
/**
* 前のコンポーネントにフォーカスをセットする<BR>
* この処理はフォーカス移動時に自動で呼ばれる
*
* @param focusCycleRoot
* @param component
* @return
*/
@Override
public Component getComponentBefore(Container focusCycleRoot, Component component) {
return prevComponent(focusCycleRoot, component);
}
/**
* デフォルトのコンポーネントにフォーカスをセットする<BR>
* この処理はフォーカス移動時に自動で呼ばれる
*
* @param focusCycleRoot
* @return
*/
@Override
public Component getDefaultComponent(Container focusCycleRoot) {
if (!componentList.isEmpty()) {
return getFirstComponent(focusCycleRoot);
} else {
return null;
}
}
private Component nextComponent(Container focusCycleRoot, Component component) {
Component resultComponent = null;
Integer index = componentList.indexOf(component);
// ない場合は先頭を返す
if (index == -1) {
resultComponent = getDefaultComponent(focusCycleRoot);
} else {
// 現在位置からのイテレータを作成
ListIterator<Component> ite = componentList.listIterator(index + 1);
while(ite.hasNext()) {
// 有効なComponentがあればそれを返す
Component temp = ite.next();
if (temp.isEnabled() && temp.isFocusable()) {
resultComponent = temp;
break;
}
}
// 最後まで進んでいた場合は最初のComponentを返す
if (resultComponent == null) {
resultComponent = getFirstComponent(focusCycleRoot);
}
}
return resultComponent;
}
private Component prevComponent(Container focusCycleRoot, Component component) {
Component resultComponent = null;
Integer index = componentList.indexOf(component);
// ない場合はデフォルトを返す
if (index == -1) {
resultComponent = getDefaultComponent(focusCycleRoot);
} else {
// 現在位置からのイテレータを作成
ListIterator<Component> ite = componentList.listIterator(index);
while(ite.hasPrevious()) {
// 有効なComponentがあればそれを返す
Component temp = ite.previous();
if (temp.isEnabled() && temp.isFocusable()) {
resultComponent = temp;
break;
}
}
// 最初まで戻った場合は最後のComponentを返す
if (resultComponent == null) {
resultComponent = getLastComponent(focusCycleRoot);
}
}
return resultComponent;
}
}
public class Main extends javax.swing.JFrame {
public Main() {
// 定義したいフォーカス順にコンポーネントを追加する
List<Component> componentList = new ArrayList<Component>;
componentList.add(txtField1);
componentList.add(btnPrint);
componentList.add(txtField2);
// フォーカス定義の設定
this.setFocusTraversalPolicy(new O3FFocusTraversalPolicy(componentList));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment