JavaFX,禁用TableView中的完整行

JavaFX,禁用TableView中的完整行,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我在禁用TableView中的行时遇到问题。我有一个包含三列的TableView。名称列、值列和复选框列。如果用户选中复选框,则应使用与选中行中的值相同的值禁用所有行。我尝试使用ReactFX2框架在禁用的属性和单元格之间创建绑定,但没有成功。有没有一个简单的方法来处理我的问题。这是我的密码: 交通量 package ExternalRessources; import javafx.beans.property.BooleanProperty; import javafx.beans

我在禁用TableView中的行时遇到问题。我有一个包含三列的TableView。名称列、值列和复选框列。如果用户选中复选框,则应使用与选中行中的值相同的值禁用所有行。我尝试使用ReactFX2框架在禁用的属性和单元格之间创建绑定,但没有成功。有没有一个简单的方法来处理我的问题。这是我的密码:

交通量

    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;
    private  BooleanProperty disabled;

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

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

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

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

    public BooleanProperty checkedProperty()
    {
        return check;
    }

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

    public BooleanProperty disabledProperty()
    {
        return disabled;
    }

    public Boolean getDisabled() {
        return disabled.get();
    }




}
控制器类

    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.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableRow;
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()
    {
        String EBG = exchange.getSelectedEBG();
        switch(EBG)
        {
            case "Central":
            {
                this.createTable(exchange.getCentralTVID());
                break;
            }
            case "West":
            {
                this.createTable(exchange.getWestTVID());
                break;
            }
            case "East":
            {
                this.createTable(exchange.getEastTVID());
                break;
            }
            case "North":
            {
                this.createTable(exchange.getNorthTVID());
                break;
            }
            case "South":
            {
                this.createTable(exchange.getSouthTVID());
                break;
            }
        }
    }


    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);  

    }


}
应禁用ffm15,因为lvl是所选lvl的一部分。
谢谢你的帮助

您可以尝试以下方法。该示例仅适用于最后3位数字,因此您需要对其进行修改以满足您的需要

//将IntegerProperty添加为类字段:

private IntegerProperty maxvalue = new SimpleIntegerProperty(999);
//更改列类型

@FXML

private TableColumn < TrafficVolume, Boolean > TABLECOLCHECKBOX;
//GUI设计必须已经存在于TVIDSelectionPanel.fxml文件中。无需重新声明和添加列

//现在是CellFactory部分:

TABLECOLFLIGHTLVL.setCellValueFactory(new PropertyValueFactory<>("flightLVL"));
 TABLECOLFLIGHTLVL.setCellFactory(new Callback < TableColumn < TrafficVolume, String >, TableCell < TrafficVolume, String >>() {

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

                TableCell<TrafficVolume, String> cell = new TableCell<TrafficVolume, String>(){

                    @Override
                    protected void updateItem(String item, boolean empty) {
                        if(item != null){
                        super.updateItem(item, empty); 
                        setText(empty ? null : item);
                        Integer myVal1 = Integer.valueOf(item.substring(4));
                        TableRow<TrafficVolume> tr = getTableRow();
                             if(tr.getItem().getCheck()){
                                 maxvalue.set(myVal1);
                             }
                tr.disableProperty().bind(Bindings.greaterThan(myVal1, maxvalue));

                 DoubleBinding bind2 = new DoubleBinding() {

                                {super.bind(maxvalue);}
                            @Override
                            protected double computeValue() {
                                //you can put other statements here, e.g to change Style
                                if(myVal1 > maxvalue.get()){
                                    return 0.5;
                                }else{
                                    return 1.0;
                                }
                            }
                        };

               tr.opacityProperty().bind(bind2);
                        }
                    }

                };

                return cell;
            }
        });


TABLECOLCHECKBOX.setCellValueFactory(new PropertyValueFactory<>("check"));
TABLECOLCHECKBOX.setCellFactory(new Callback<TableColumn<TrafficVolume, Boolean>, TableCell<TrafficVolume, Boolean>>() {
 @Override
 public TableCell<TrafficVolume, Boolean> call(TableColumn<TrafficVolume, Boolean> param) {
 TableCell<TrafficVolume, Boolean> cell = new CheckBoxTableCell<TrafficVolume, Boolean>(){
 @Override
  public void updateItem(Boolean item, boolean empty) {
  if(item != null ){
  super.updateItem(item, empty); 
  TableRow<TrafficVolume> tr = getTableRow();
  if(tr.getItem().checkedProperty().get()){
  tr.setStyle("-fx-background-color:lightgreen");
  }
  }
  }
 };

  cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
 @Override
 public void handle(MouseEvent event) {
 TrafficVolume tv = (TrafficVolume) cell.getTableRow().getItem();
 String lvl = tv.getFlightLVL();
 if(tv.getCheck()){
 maxvalue.set(Integer.valueOf(ordNr.substring(4)));
 cell.getTableRow().setStyle("-fx-background-color:lightgreen");
 }else{
 maxvalue.set(999);
 cell.getTableRow().setStyle("");    
}
}
});
 return cell;
}
});
TABLECOLFLIGHTLVL.setCellValueFactory(新属性值工厂(“flightLVL”);
TABLECOLFLIGHTLVL.setCellFactory(新回调,TableCell(){
@凌驾
公共TableCell调用(TableColumn参数){
TableCell单元格=新的TableCell(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
如果(项!=null){
super.updateItem(项,空);
setText(空?空:项);
整数myVal1=整数.valueOf(项.子字符串(4));
TableRow tr=getTableRow();
if(tr.getItem().getCheck()){
maxvalue.set(myVal1);
}
tr.disableProperty().bind(Bindings.greaterThan(myVal1,maxvalue));
DoubleBinding bind2=新的DoubleBinding(){
{super.bind(maxvalue);}
@凌驾
受保护的双计算值(){
//您可以在此处放置其他语句,例如更改样式
if(myVal1>maxvalue.get()){
返回0.5;
}否则{
返回1.0;
}
}
};
tr.opacityProperty().bind(bind2);
}
}
};
返回单元;
}
});
TABLECOLCHECKBOX.setCellValueFactory(新属性ValueFactory(“检查”);
TABLECOLCHECKBOX.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn参数){
TableCell单元格=新的CheckBoxTableCell(){
@凌驾
public void updateItem(布尔项,布尔空){
如果(项!=null){
super.updateItem(项,空);
TableRow tr=getTableRow();
if(tr.getItem().checkedProperty().get()){
tr.setStyle(“-fx背景色:浅绿色”);
}
}
}
};
cell.addEventFilter(MouseEvent.MOUSE_单击,新建EventHandler()){
@凌驾
公共无效句柄(MouseeEvent事件){
TrafficVolume tv=(TrafficVolume)cell.getTableRow().getItem();
String lvl=tv.getFlightLVL();
if(tv.getCheck()){
maxvalue.set(Integer.valueOf(ordNr.substring(4));
cell.getTableRow().setStyle(“-fx背景色:浅绿色”);
}否则{
maxvalue.set(999);
cell.getTableRow().setStyle(“”);
}
}
});
返回单元;
}
});

确保复选框作为单选按钮是互斥的,否则在启动时只设置最后一个有效的maxvalue(假设所有数据都存储在db中)

Start。带有复选框的回调正在工作,我说的是禁用像“灰显”这样的行
@Override

public void initialize(URL url, ResourceBundle rb)
TABLECOLFLIGHTLVL.setCellValueFactory(new PropertyValueFactory<>("flightLVL"));
 TABLECOLFLIGHTLVL.setCellFactory(new Callback < TableColumn < TrafficVolume, String >, TableCell < TrafficVolume, String >>() {

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

                TableCell<TrafficVolume, String> cell = new TableCell<TrafficVolume, String>(){

                    @Override
                    protected void updateItem(String item, boolean empty) {
                        if(item != null){
                        super.updateItem(item, empty); 
                        setText(empty ? null : item);
                        Integer myVal1 = Integer.valueOf(item.substring(4));
                        TableRow<TrafficVolume> tr = getTableRow();
                             if(tr.getItem().getCheck()){
                                 maxvalue.set(myVal1);
                             }
                tr.disableProperty().bind(Bindings.greaterThan(myVal1, maxvalue));

                 DoubleBinding bind2 = new DoubleBinding() {

                                {super.bind(maxvalue);}
                            @Override
                            protected double computeValue() {
                                //you can put other statements here, e.g to change Style
                                if(myVal1 > maxvalue.get()){
                                    return 0.5;
                                }else{
                                    return 1.0;
                                }
                            }
                        };

               tr.opacityProperty().bind(bind2);
                        }
                    }

                };

                return cell;
            }
        });


TABLECOLCHECKBOX.setCellValueFactory(new PropertyValueFactory<>("check"));
TABLECOLCHECKBOX.setCellFactory(new Callback<TableColumn<TrafficVolume, Boolean>, TableCell<TrafficVolume, Boolean>>() {
 @Override
 public TableCell<TrafficVolume, Boolean> call(TableColumn<TrafficVolume, Boolean> param) {
 TableCell<TrafficVolume, Boolean> cell = new CheckBoxTableCell<TrafficVolume, Boolean>(){
 @Override
  public void updateItem(Boolean item, boolean empty) {
  if(item != null ){
  super.updateItem(item, empty); 
  TableRow<TrafficVolume> tr = getTableRow();
  if(tr.getItem().checkedProperty().get()){
  tr.setStyle("-fx-background-color:lightgreen");
  }
  }
  }
 };

  cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
 @Override
 public void handle(MouseEvent event) {
 TrafficVolume tv = (TrafficVolume) cell.getTableRow().getItem();
 String lvl = tv.getFlightLVL();
 if(tv.getCheck()){
 maxvalue.set(Integer.valueOf(ordNr.substring(4)));
 cell.getTableRow().setStyle("-fx-background-color:lightgreen");
 }else{
 maxvalue.set(999);
 cell.getTableRow().setStyle("");    
}
}
});
 return cell;
}
});