Created
November 30, 2012 04:23
-
-
Save xnrghzjh/4173762 to your computer and use it in GitHub Desktop.
Swingのフォーカス制御
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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