【问题标题】:Javafx tableview adding imageJavafx tableview添加图像
【发布时间】:2017-07-25 11:23:57
【问题描述】:
@FXML private javafx.scene.control.TableView<User> userTableView;

@FXML private TableColumn<User, Image> isActiveColumn;
@FXML private TableColumn<User, String> userNameColumn;
@FXML private TableColumn<User, String> taskColumn;
@FXML private TableColumn<User, String> firstNameColumn;
@FXML private TableColumn<User, String> lastNameColumn;
@FXML private TableColumn<User, String> editDeleteColumn;

public static ObservableList<User> data;

public void initialize() throws SQLException {
   try {
       data = FXCollections.observableArrayList();
        addUsers();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public void clickAddUser() throws Exception{

    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/addUser.fxml"));
    Parent root =  fxmlLoader.load();
    Stage stage = new Stage();
    stage.setScene(new Scene(root));
    stage.show();
}

//tablewiev'e kullanici eklenmesi
public void addUsers() throws SQLException {
    try {
        List<User> userList = Main.dbManager.getUserList();

     if(userList.size() != 0){
            for (int i=0; i<userList.size(); i++){
                User aUser = userList.get(i);
                data.add(aUser);
            }
        }

        isActiveColumn.setMinWidth(200);
        isActiveColumn.setCellFactory(new Callback<TableColumn<User, Image>, TableCell<User, Image>>() {
            public TableCell<User, Image> call(TableColumn<User, Image> param) {

                final ImageView imageView = new ImageView();
                imageView.setFitHeight(50);
                imageView.setFitWidth(50);

                    TableCell<User, Image> cell = new TableCell<User, Image>(){

                        @Override
                        protected void updateItem(Image item, boolean empty) {
                            if(item != null)
                              imageView.setImage(new Image("images/if_User-green_85406.png"));
                        }

                    };
                    cell.setGraphic(imageView);
                    return cell;
            }
        });
        isActiveColumn.setCellValueFactory(new PropertyValueFactory<User, Image>("image"));

        userNameColumn.setMinWidth(200);
        userNameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("aUsername"){
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<User, String> param) {
                return new ReadOnlyObjectWrapper(param.getValue().getUsername());
            }
        });

        taskColumn.setMinWidth(200);
        taskColumn.setCellValueFactory(new PropertyValueFactory<User, String>("aTask"){
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<User, String> param) {
                return new ReadOnlyObjectWrapper(param.getValue().getTask());
            }
        });

        firstNameColumn.setMinWidth(200);
        firstNameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("aFirstname"){
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<User, String> param) {
                return new ReadOnlyObjectWrapper(param.getValue().getFirstname());
            }
        });

        lastNameColumn.setMinWidth(200);
        lastNameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("aLastname"){
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<User, String> param) {
                return new ReadOnlyObjectWrapper(param.getValue().getLastname());
            }
        });

        editDeleteColumn.setMinWidth(200);
        editDeleteColumn.setCellValueFactory(new PropertyValueFactory<User, String>("editDeleteCol"));

        userTableView.setItems(data);

    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public ObservableList<User> getData(){
    return data;
}

}

如果是主动或被动,我想添加图像。我添加了主动或被动状态布尔值。我不知道它会如何,但在此之前我尝试添加静态图像 updateItem 方法从未被调用过。你能帮忙吗?

【问题讨论】:

    标签: image javafx tableview add


    【解决方案1】:

    假设您的User 类定义了一个布尔属性active,即

    public class User {
    
        private final BooleanProperty active = new SimpleBooleanProperty(false);
    
        public BooleanProperty activeProperty() {
           return active ;
        }
    
        public final boolean isActive() {
            return activeProperty().get();
        }
    
        public final void setActive(boolean active) {
            activeProperty().set(active);
        }
    
        // other properties...
    }
    

    那么您应该将isActiveCol 设为TableColumn&lt;User, Boolean&gt; 并将其设置为:

    @FXML private TableColumn<User, Boolean> isActiveColumn;
    
    // ...
    
    public void addUsers() {
    
        // ...
    
        isActiveColumn.setCellValueFactory(new PropertyValueFactory<>("active"));
    
        isActiveColumn.setCellFactory(tc -> {
            final Image activeImage = new Image(...);
            final Image passiveImage = new Image(...);
            TableCell<User, Boolean> cell = new TableCell<User, Boolean>() {
                private ImageView imageView = new ImageView();
                @Override
                protected void updateItem(Boolean active, boolean empty) {
                    super.updateItem(active, empty);
                    if (empty) {
                        setGraphic(null);
                    } else {
                        if (active) {
                            imageView.setImage(activeImage);
                        } else {
                            imageView.setImage(passiveImage);
                        }
                        setGraphic(imageView);
                    }
                }
            };
            return cell ;
        });
    }
    

    【讨论】:

    • 我按照你说的做了,但是'active'参数为空。所以它给出了 NullPointerException?
    • 当单元格非空时,active 参数无法为空。我更改了User 类中属性的初始化,但我认为这没有任何区别。你确定是这个问题吗?
    • 我改变了 isActiveColumn.setCellValueFactory(new PropertyValueFactory("active")); “活动”到 isActive 并且它有效。谢谢...
    • @user1020141 PropertyValueFactory 的那个参数需要匹配User 中的方法名称:我有activeProperty()isActive(),所以在这种情况下应该是"active"。如果您的方法名称不同,则需要不同的参数。 (如果它适合您,您应该将此答案标记为正确。)
    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 2015-08-23
    • 2018-08-19
    • 2021-12-04
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多