2016-04-06 1 views
0

私は以下のセルファクトリを列に適用します。テーブルセルのコンボボックス - アクションが実行されない

targetEnviroment.setCellFactory(new Callback<TableColumn<DevWorkTabBench, String>, TableCell<DevWorkTabBench, String>>() { 

       @Override 
       public TableCell<DevWorkTabBench, String> call(TableColumn<DevWorkTabBench, String> param) { 
        TableCell<DevWorkTabBench, String> cell = new TableCell<DevWorkTabBench, String>() { 
         @Override 
         public void updateItem(String item, boolean empty) { 
          super.updateItem(item, empty); 

          String status = null; 
          try { 
           status = getTableView().getItems().get(getIndex()).getObjectStatus(); 
          } catch (IndexOutOfBoundsException ex) { 
          status = ""; 
          } 
          if (status.equalsIgnoreCase("ReadyForDeployment")) { 

           ComboBox<String> comboBox = new ComboBox(environmentList); 
           comboBox.valueProperty().addListener(new ChangeListener<String>() { 

            @Override 
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
             commitEdit(newValue); 
            } 
           }); 

           comboBox.setOnShown(new EventHandler<Event>() { 
            @Override 
            public void handle(Event event) { 
             getTableView().edit(getIndex(), getTableColumn()); 
             getTableView().getSelectionModel().select(getIndex()); 

            } 
           }); 
           comboBox.setValue(item); 
           setGraphic(comboBox); 
          } else { 
           setGraphic(null); 
          } 

          if (empty) { 
           setGraphic(null); 

          } 
         } 
        }; 

        return cell; 
       } 

      }); 

私が言及した状態にstatusを変更すると、私は、その特定のセル内ComboBoxの外観を得るが、ドロップダウンは発生しません。複数回クリックしても、comboboxのアクションは実行されていないようです。私は扱われたもの以外の例外はありません。他の列は、編集可能であり、期待通りにタスクを実行します。

ここで何が間違っているかわかりません。誰でも助けてくれますか?

答えて

1

(空でない)セルにコンボボックスを常に表示しているので、標準TextFieldTableCellなどのように「編集」モードに入る必要はありません。実装はCheckBoxTableCellと似ています。これは基本的に編集メカニズムをバイパスします。 CheckBoxTableCellは、チェックボックスが常にインタラクティブで、直接 ユーザーが切り替えることができることを を意味し、チェックボックス「ライブ」をレンダリングすること

注:documentation for that classから。これは、セルが編集の状態に入る必要はないことを意味します(通常、ユーザーがセルをダブルクリックします)。 A これの副作用は、通常の編集コールバック(例えば、 編集コミット)が呼び出されないことです。 の変更を通知する場合は、CheckBoxで操作されるブール値のプロパティー を直接監視することをお勧めします。

だからあなたのセルの実装では、同様に動作します:あなたがじゃないと動作しません。これ等の方法((私は物事をめちゃくちゃにされたと考えている)edit(...)を起動していないとcommitEdit(...)に依存しない、cancelEdit()編集状態で)、モデルクラスを直接更新するだけです。

MCVEが動作しないのでテストできませんので、これは直接動作しないかもしれませんが、動作するようなものに向けるには十分であるはずです。

targetEnviroment.setCellFactory(new Callback<TableColumn<DevWorkTabBench, String>, TableCell<DevWorkTabBench, String>>() { 

    @Override 
    public TableCell<DevWorkTabBench, String> call(TableColumn<DevWorkTabBench, String> param) { 
     TableCell<DevWorkTabBench, String> cell = new TableCell<DevWorkTabBench, String>() { 
      @Override 
      public void updateItem(String item, boolean empty) { 
       super.updateItem(item, empty); 

       if (empty) { 
        setGraphic(null) ; 
       } else { 
        String status = getTableView().getItems().get(getIndex()).getObjectStatus(); 

        if (status.equalsIgnoreCase("ReadyForDeployment")) { 

         ComboBox<String> comboBox = new ComboBox(environmentList); 
         comboBox.valueProperty().addListener(new ChangeListener<String>() { 

          @Override 
          public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
           //commitEdit(newValue); 
           getTableView().getItems().get(getIndex()).setObjectStatus(newValue); 
          } 
         }); 

         comboBox.setValue(item); 
         setGraphic(comboBox); 
        } else { 
         setGraphic(null); 
        } 
       } 
      } 
     }; 

     return cell; 
    } 

}); 
+0

ありがとうございました@James_D。私の問題は解決しました。しかし、私はまだセルを編集可能にしてしまうのは理解できません。私は他の場所でも同じロジックを使用しています(「ツリービュー」のように)。同じコードが同じシステムで動作していますが、他の場所でも動作しています。同じロジックが望ましい出力を与えますが、ここでは出力しません。どのように2つの異なる結果をもたらすことができますか? –

+0

私の推測では、 'edit()'を呼び出すと 'updateItem()'が呼び出されます。それで、グラフィックを新しいコンボボックス(そのポップアップは表示されません)で置き換えます。私。ユーザーがポップアップを表示させるとすぐに、コンボボックスを置き換えます。しかし、推測です。CheckBoxTableCellの実装の教訓は、 "ライブ"編集セル、つまりグラフィックが常に表示されているセル(コンボボックスではより適切だと思います)の場合のようです編集状態に入ったり出たりすることはまったくありません。 –

+0

'if(isEditing()){comboBox.show();}'のように 'updateItem()'のロジックを試してみることもできますが、非常に壊れやすい方法です。 –

関連する問題