Skip to content

Instantly share code, notes, and snippets.

@xnrghzjh
Created November 30, 2012 04:23
Show Gist options
  • Select an option

  • Save xnrghzjh/4173762 to your computer and use it in GitHub Desktop.

Select an option

Save xnrghzjh/4173762 to your computer and use it in GitHub Desktop.

Revisions

  1. xnrghzjh created this gist Nov 30, 2012.
    195 changes: 195 additions & 0 deletions O3FFocusTraversalPolicy.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,195 @@
    /*
    * 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;
    }

    }
    15 changes: 15 additions & 0 deletions sample.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    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));
    }

    }