2016-03-30 2 views
0

私はJavafxのTable Viewで作業していましたが、それ自体がTable Viewの一部であるボタンクリックでセルを動的に制御したいと思います。私はそれを自分自身でやろうとしましたが、そのようには動作しませんでした。それで、できないように助けが必要です。JavaFX:Tableviewのボタンをクリックすると動的なセルコントロールが可能ですか?

ボタンのTableCellコード:ボタンをクリックする前に

dlColumn.setCellValueFactory(new PropertyValueFactory<>("")); 
dlColumn.setCellFactory(new Callback<TableColumn<SharedFileInfo, String>, TableCell<SharedFileInfo, String>>() { 

     @Override 
     public TableCell<SharedFileInfo, String> call(TableColumn<SharedFileInfo, String> param) { 

      final TableCell<SharedFileInfo, String> cell; 
      cell = new TableCell<SharedFileInfo, String>() { 
       final Button downloadButton = new Button(); 

       @Override 
       protected void updateItem(String item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         setGraphic(null); 
         setText(null); 
        } else { 
         downloadButton.setOnAction((ActionEvent ae) -> { 
          progressColumn.setCellValueFactory(new PropertyValueFactory<>("progress")); 
          progressColumn.setCellFactory(new Callback<TableColumn<SharedFileInfo, Double>, TableCell<SharedFileInfo, Double>>() { 

         @Override 
         public TableCell<SharedFileInfo, Double> call(TableColumn<SharedFileInfo, Double> param) { 

         final ProgressBar progressBar = new ProgressBar(); 

         final TableCell<SharedFileInfo, Double> cell; 
         cell = new TableCell<SharedFileInfo, Double>() { 

           @Override 
           protected void updateItem(Double item, boolean empty) { 
           super.updateItem(item, true); 
           if (empty) { 
           setGraphic(null); 
           setText(null); 
           } else { 
            SharedFileInfo sharedinfo = getTableView().getItems().get(this.getIndex()); 
            progressBar.progressProperty().bind(sharedinfo.getProgress()); 

            setGraphic(progressBar); 
            progressBar.prefWidthProperty().bind(this.widthProperty()); 
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
            } 
           } 

          }; 
          return cell; 
         } 
        }); 
         }); 
         setGraphic(downloadButton); 
         setText(null); 
        } 
       } 
      }; 
      return cell; 
     } 
    }); 


、すべてが期待通りに動作しているようですが、私はボタンをクリックすると、全体progress列がどのようなIドンである空のProgress Barsで満たされますしたくない。私は、ユーザーがボタンをクリックするたびに、その行だけがProgress Barを表示し、すべてのレストがsetGraphic(null);に設定されたいと思っています。これで私を助けてください!
enter image description here> enter image description here

答えて

1

現在、私はIDEにアクセスできませんので、プレーンテキストを書きます。

(任意の)ダウンロードボタンをクリックすると、新しいCellFactoryが列全体に割り当てられます。これは、「進行させたい」行とそれ以外の行を区別しません。 すべてのレコードはprogressPropertyを参照しますが、クリックされたSharedFileInfo-RowのprogressPropertyの1つだけが変更されています。あなたがチェックできる

あなたは(あなたも一度それを設定し、例えば、トリガーBooleanPropertyを実装する可能性があるため、私は、提案しないであろう)
、すべてのButtonClickにCellFactoryを追加し、このようにそれをやって維持したい場合は 、クリックされたボタンの列のSharedFileInfo-インスタンスがある場合==あなたの内側のCellFactoryでSharedFileInfoインスタンス

ヒント:Javafx, get the object referenced by a TableCell

編集: 一例としてどのようにあなたの目標を達成するために、次のように動作します:

  1. 初め
  2. ボタン-カラム・ファクトリーでCellFactoriesを設定するグローバルSharedFileInfoフィールド
  3. を作成します。ボタンクリックグローバルフィールド= clickedCells SharedFileInfo-インスタンス
  4. 進捗-、カラム・セットにFactory:各セルは、SharedFileInfo-instanceがグローバルフィールドの値であるかどうかをチェックし、そうであればプログレスバーを表示します。

おそらく、セルに外観を更新するグローバルフィールドの値を設定した後グローバルProperty + ChangeListenerで作業することをお勧めします。

+0

私は投稿後に私の質問をチェックすることができませんでしたので、私は希望の仕事をすることができるいくつかの方法を考えています。私はここにテーブル全体を表示していませんが、すべての場合に静的に(一度作成され、レンダリング中に)なる名前の列もあります。だから、私は明示的にそれのためのセルファクトリーを提供し、 'setProgress(2);'名前セルがレンダリングされるたびに設定します。ですから、Progress-Cell-Factoryが== 2、 'setGraphic(null)'、 'setGraphic(progressBar)'のときにprogressプロパティのこの振る舞いをクロスチェックすることができます。 – androizer

+0

私は一日待って、他のユーザーが他の方法がある場合は回答を出させ、そうでなければ私は答えを最終としてマークします。 – androizer

関連する問題