gpt4 book ai didi

javafx - 在使用TableColumn 而不是TableColumn 在JavaFX8 TableView中选择一个单元格时,为什么编译器会生成未经检查的警告?

转载 作者:行者123 更新时间:2023-12-02 10:41:29 25 4
gpt4 key购买 nike

一个相对的Java新手问题。

我正在清理代码,并在以编程方式选择TableView中的单元格时遇到了两个未经检查的警告(“未经检查的方法调用”和“未经检查的转换”)。我能够解决警告,但不知道是什么原因引起的。

这就是我最初编码select()的方式:

TablePosition<?, ?> previousPos;
//...
table.getSelectionModel().select
(previousPos.getRow(), previousPos.getTableColumn());

我通过将其更改为警告来解决了警告。
table.getSelectionModel().select
(previousPos.getRow(), table.getColumns().get(previousPos.getColumn()));

我不了解它们之间的区别,所以我看了一下Java源代码。如果我正确地解释了它,则TableView.java中的 select()方法需要 TableColumn<S, ?>。但是,TablePosition.java中的 getTableColumn()返回 TableColumn<S,T>,而TableView.java中的 getColumns()返回 ObservableList类型的 TableColumn(S, ?)

我猜这就是 table.getColumns().get(...)编译干净而 previousPos.getTableColumn()生成错误的原因。

但是,从编译器的 Angular 来看, TableColumn<S, ?>TableColumn<S,T>有什么区别?它为什么不将 T解析(是正确的术语?)为 ?

如果有帮助,这里是我正在尝试解决的MVCE,但是答案超出了我目前的Java知识。 select()moveToPreviousPos()中。

我正在使用JavaFX8(JDK1.8.0_181),NetBeans 8.2和Scene Builder 8.3。
package test27;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class Test27 extends Application {

TableView<TestModel> table = new TableView<>();

//Both of these stop the "unchecked conversion" error on line #51 (previousPos = table.getFocusModel().getFocusedCell();)
// TablePosition previousPos;
TablePosition<?, ?> previousPos;
//but using the following generates the "unchecked conversion" error
// TablePosition<TestModel, ?> previousPos;

private Parent createContent() {

ObservableList<TestModel> olTestModel = FXCollections.observableArrayList();

olTestModel.add(new TestModel("A"));
olTestModel.add(new TestModel("B"));
olTestModel.add(new TestModel("C"));

table.setItems(olTestModel);

TableColumn<TestModel, String> colText = new TableColumn<>("text");
colText.setCellValueFactory(cellData -> cellData.getValue().textProperty());
colText.setCellFactory(TextFieldTableCell.forTableColumn());

table.getSelectionModel().setCellSelectionEnabled(true);
table.setEditable(true);
table.getColumns().add(colText);

Button btnGetTablePosition = new Button("get table position");
btnGetTablePosition.setOnAction(event -> {
//TableView.java: getFocusedCell returns TablePosition<S, ?>
previousPos = table.getFocusModel().getFocusedCell(); //Line #51
outputPreviousPos(previousPos);
});

Button btnMoveToPreviousPos = new Button("move to previous pos");
btnMoveToPreviousPos.setOnAction(event -> {
moveToPreviousPos(previousPos);
});

BorderPane content = new BorderPane(table);
HBox hb = new HBox();
hb.getChildren().addAll(btnGetTablePosition, btnMoveToPreviousPos);

content.setTop(hb);

return content;

}

public void outputPreviousPos(TablePosition previousPos){

System.out.println("previousPos = " + previousPos);

}

public void moveToPreviousPos(TablePosition previousPos) {

//select() in TableView.java expects TableColumn<S, ?>
//getTableColumn() in TablePosition.java returns TableColumn<S,T>
//getColumns() in TableView.java returns an ObservableList of type TableColumn(S, ?)

//Is that why the following line generates "unchecked method invocation" and "unchecked conversion" errors
//table.getSelectionModel().select
// (previousPos.getRow(), previousPos.getTableColumn());
//but the following line compiles clean?
table.getSelectionModel().select
(previousPos.getRow(), table.getColumns().get(previousPos.getColumn()));

}

public class TestModel {

private StringProperty text;

public TestModel() {
this("");
}

public TestModel(
String text
) {
this.text = new SimpleStringProperty(text);
}

public String getText() {
return text.get();
}

public void setText(String text) {
this.text.set(text);
}

public StringProperty textProperty() {
return text;
}

}

@Override
public void start(Stage stage) throws Exception {
stage.setScene(new Scene(createContent()));
stage.setTitle("Test");
stage.setWidth(500);
stage.show();
}

public static void main(String[] args) {
launch(args);
}

}

最佳答案

首先,我要说TableView.getFocusModel().getFocusedCell()(或focusedCellProperty())使用原始TablePosition类型(原始TablePosition只能转换为TablePositon<?, ?>而不产生警告)是设计缺陷。更合适的版本可能是TablePosition<S, ?>

由于TablePosition代表TableView中任何位置的特定单元格,因此对于TableView.getFocusModel().focusedCellProperty():

  • S的类型对于TableView<S>是固定的(即,该类型是已知的)。
  • T的类型是指特定TableColumn的类型,它可以根据聚焦的单元格而变化。您无法在编译时确定类型,因为您不知道将选择哪个TableColumn<S, T>

  • 现在到第二点。

    But what is the difference, then, between TableColumn<S, ?> and TableColumn<S,T> from the compiler's point of view? Why doesn't it resolve (is that the correct term?) the T to ?.



    这是因为 ?中的 TableColumn<S, ?>是通配符。由于 TableViewFocusModel<S>不具有 T类型,并且它不能基于固定列进行操作,因此它必须在此处使用 ?(请参阅我解释的第一点)。

    另一方面, TableView.getSelectionModel().select()期望 introw和column的 TableColumn<S, ?>。由于您具有 TablePosition<?, ?> previousPos,因此 previousPos也将返回 TableColumn<?, ?>TableColumn<S, ?TableColumn<?, ?>非常不同-如果允许 TableColumn,则可以使用其他 TableViewTableColumn<?, ?>

    最后,如果 TableView.getFocusModel().getFocusedCell()的API是固定的,那么当您使用 select()时就不会有问题。在此之前,您可以通过抑制手动将其强制转换为 TablePosition<TestModel, ?>,或者像您一样使用 TableView.getColumns().get(index)

    关于javafx - 在使用TableColumn <S,T>而不是TableColumn <S,?>在JavaFX8 TableView中选择一个单元格时,为什么编译器会生成未经检查的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52693823/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com