2017-04-07 32 views
1

私はJavaFXで大きな問題があります。私はTableViewを作成しました。私はいくつかのCheckBoxをTableViewに追加しました。誰かがTableViewのチェックボックスをチェックすると、イベントをトリガーしたいと思います。私はいくつかの方法を試しましたが、私はいつも同じ問題を抱えています。私はプログラムを起動し、GUIを表示する前に "CheckBox trigger event"を5回実行します。その後、私はチェックボックスをクリックすることができますが、何も起こりませんでした。これは私のコードなので、私が助けてくれることを願っています。どうも!JavaFX、誰かがTableviewのCheckBoxをチェックした場合、どのようにイベントをトリガーするのですか?

Controller.class

package GUI; 

import java.io.IOException; 
import java.util.ArrayList; 

import javafx.beans.value.ObservableValue; 
import ExternalRessources.TrafficVolume; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.control.Button; 
import javafx.scene.control.CheckBox; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.CheckBoxTableCell; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class TVIDSelectionPanelController { 


    @FXML 
    private Button BACKBUTTON; 
    @FXML 
    private Button TEST; 
    @FXML 
    private MenuItem MENUITEMSETTINGS; 
    @FXML 
    private MenuBar MENUBAR; 
    @FXML 
    private GridPane GRIDPANETVID; 
    @FXML 
    private TableView<TrafficVolume> TABLETVID; 
    @FXML 
    private TableColumn<TrafficVolume, String> TABLECOLTVID; 
    @FXML 
    private TableColumn<TrafficVolume, String> TABLECOLFLIGHTLVL; 
    @FXML 
    private TableColumn<TrafficVolume, CheckBox> TABLECOLCHECKBOX; 
    @FXML 
    private AnchorPane TABLEPANE; 

    private ExchangeController exchange; 
    public ObservableList<TrafficVolume> list = FXCollections.observableArrayList(); 

    @FXML 
    private void handleBACKBUTTON(ActionEvent event) throws IOException 
    {   


    } 

    public void init(ExchangeController ex) 
    { 
     this.exchange =ex; 
    } 

    @FXML 
    public void initalize() throws IOException 
    { 
     this.ChooseData(); 
    } 

    @FXML 
    private void ChooseData() 
    { 
     switch(exchange.getSelectedEBG()) 
     { 
      case "Central": 
      { 
       this.createTable(exchange.getCentralTVID()); 
      } 
      case "West": 
      { 
       this.createTable(exchange.getWestTVID()); 
      } 
      case "East": 
      { 
       this.createTable(exchange.getEastTVID()); 
      } 
      case "North": 
      { 
       this.createTable(exchange.getNorthTVID()); 
      } 
      case "South": 
      { 
       this.createTable(exchange.getSouthTVID()); 
      } 
     } 
    } 


    private void createTable(ArrayList<ArrayList<String>> ListTVID) 
    { 
     for(int i=0;i<ListTVID.size();i++) 
     { 
      list.add(new TrafficVolume(ListTVID.get(i).get(0),ListTVID.get(i).get(1))); 
     } 
     TableColumn<TrafficVolume, String> TVIDs = new TableColumn<TrafficVolume, String>("TV-ID"); 
     TableColumn<TrafficVolume, String> FLVL = new TableColumn<TrafficVolume, String>("Flight Level"); 
     TableColumn<TrafficVolume, Boolean> checkedCol = new TableColumn<TrafficVolume, Boolean>("Active"); 
     TABLETVID.setItems(list); 
     TABLETVID.getColumns().addAll(TVIDs,FLVL,checkedCol); 
     TVIDs.setCellValueFactory(new PropertyValueFactory<TrafficVolume, String>("name")); 
     FLVL.setCellValueFactory(new PropertyValueFactory<TrafficVolume, String>("flightLVL")); 
     checkedCol.setCellValueFactory(new PropertyValueFactory<TrafficVolume, Boolean>("check")); 
     checkedCol.setCellFactory(CheckBoxTableCell.forTableColumn(checkedCol)); 
     checkedCol.setEditable(true); 
     TABLETVID.setEditable(true); 

     checkedCol.setCellFactory(CheckBoxTableCell.forTableColumn(new Callback<Integer, ObservableValue<Boolean>>() 
     { 
      @Override 
      public ObservableValue<Boolean> call(Integer param) 
      { 

       return list.get(param).checkedProperty(); 
      } 
     })); 


     for (TrafficVolume trafficVolume : list) { 
      trafficVolume.checkedProperty().addListener((obs, wasChecked,isNowChecked) -> { 
        System.out.println("Checked property for " + trafficVolume.getName() + 
          " changed from "+wasChecked + " to " + isNowChecked); 
      }); 
     } 

    } 




    //Switch the Scene 
    @FXML 
    private void handleSettings(ActionEvent event) throws IOException 
    {  
     exchange.setTVIDSelectionPanelScene(MENUBAR.getParent().getScene()); 
     exchange.setTVIDSelectionPanelStage((Stage) MENUBAR.getParent().getScene().getWindow()); 
     exchange.setLastScene(exchange.getTVIDSelectionPanelScene()); 
     exchange.setLastStage(exchange.getTVIDSelectionPanelStage()); 
     exchange.initalizeStageOptions(event, MENUBAR); 

    } 


} 

TrafficVolume.class

package ExternalRessources; 

import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.value.ObservableBooleanValue; 

public class TrafficVolume { 
    private SimpleStringProperty name; 
    private SimpleStringProperty flightLVL; 
    private BooleanProperty check; 

    public TrafficVolume(String name, String flightLVL) 
    { 
     this.name = new SimpleStringProperty(name); 
     this.flightLVL = new SimpleStringProperty(flightLVL); 
     this.check = new SimpleBooleanProperty(false); 
    } 

    public String getName() { 
     return name.get(); 
    } 

    public String getFlightLVL() { 
     return flightLVL.get(); 
    } 

    public Boolean getCheck() { 
     return check.get(); 
    } 

    public BooleanProperty checkedProperty() 
    { 
     System.out.println("test"); 
     return check; 
    } 

    public void setCheck(Boolean checked) 
    { 
     this.check.set(checked); 
    } 

    public ObservableBooleanValue isChecked() 
    { 
     System.out.println("test"); 
     return check; 
    } 

} 

コンソール出力が

Checked property for EDUCNTR changed from false to true 
Checked property for EDUCNTR changed from false to true 
Checked property for EDUCNTR changed from false to true 
Checked property for EDUCNTR changed from false to true 
Checked property for EDUCNTR changed from false to true 
Checked property for EDUFFM1F changed from false to true 
Checked property for EDUFFM1F changed from false to true 
Checked property for EDUFFM1F changed from false to true 
Checked property for EDUFFM1F changed from false to true 
Checked property for EDUFFM1F changed from false to true 
Checked property for EDUFFM14 changed from false to true 
Checked property for EDUFFM14 changed from false to true 
Checked property for EDUFFM14 changed from false to true 
Checked property for EDUFFM14 changed from false to true 
Checked property for EDUFFM14 changed from false to true 
Checked property for EDUFFM24 changed from false to true 
Checked property for EDUFFM24 changed from false to true 
Checked property for EDUFFM24 changed from false to true 
Checked property for EDUFFM24 changed from false to true 
Checked property for EDUFFM24 changed from false to true 
Checked property for EDUFFM34 changed from false to true 
Checked property for EDUFFM34 changed from false to true 
Checked property for EDUFFM34 changed from false to true 
Checked property for EDUFFM34 changed from false to true 
Checked property for EDUFFM34 changed from false to true 

答えて

0

項目のcheckedProperty()秒にリスナーを追加します。

@FXML 
public void initalize() throws IOException 
    { 

    TableColumn<TrafficVolume, String> TVIDs = new TableColumn<TrafficVolume, String>("TV-ID"); 
    TableColumn<TrafficVolume, String> FLVL = new TableColumn<TrafficVolume, String>("Flight Level"); 
    TableColumn<TrafficVolume, Boolean> checkedCol = new TableColumn<TrafficVolume, Boolean>("Active"); 
    TABLETVID.setItems(list); 

    for (TrafficVolume trafficVolume : list) { 
     trafficVolume.checkedProperty().addListener((obs, wasChecked, isNowChecked) -> { 
      System.out.println("Checked property for " + trafficVolume.getName() + 
       " changed from "+wasChecked + " to " + isNowChecked); 
     } 
    } 

    // ... 
} 
+0

溶液のThx。しかし、私はまだ文字列 "System.out.println(" + trafficVolume.getName()+ "のCheckedプロパティが" + isChecked + "から" + isNowChecked "に変更されている)コンソールで5回、私は本当に理由を知らない。 – Sirox

+0

これは、 'cellFactory'の' selectedStateCallback'の 'call()'メソッドで、その文字列をコンソールに表示するように要求しているからです。したがって、工場が新しいセルを作成するたびに表示されます –

+0

この部分は、controller.classの "return list.get(param).checkedProperty();"私は1回クリックしたが、永久に5回実行されます。 – Sirox

関連する問題