Java 当我滚动鼠标时,从我设置的表格中删除文本字段和下拉列表中的图形。请帮助他人。高级感谢

Java 当我滚动鼠标时,从我设置的表格中删除文本字段和下拉列表中的图形。请帮助他人。高级感谢,java,javafx-2,Java,Javafx 2,没有滚动条一切都很好,但如果有更多的行,使用滚动条在表视图和我向下或向上滚动它的文本字段的图形自动删除 public class ComboBoxRefresh extends Application { TableColumn answerTypeCol; TableColumn answerCol; ObservableList<String> answerSelectList; ComboBox comboBox; Text

没有滚动条一切都很好,但如果有更多的行,使用滚动条在表视图和我向下或向上滚动它的文本字段的图形自动删除

 public class ComboBoxRefresh extends Application {

    TableColumn answerTypeCol; 

    TableColumn answerCol; 
    ObservableList<String> answerSelectList;

    ComboBox comboBox;

    TextField textField;

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

    @Override
    public void start(final Stage primaryStage) {

        primaryStage.setTitle("Table Cell With Multiple Components");

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

         table.setEditable(true);

          final ObservableList<AnswerOption> data = 
                    FXCollections.observableArrayList(
                        new AnswerOption("A", "Multiple Choice"),
                        new AnswerOption("1", "Free Text"),
                        new AnswerOption("78", "Free Text"),
                        new AnswerOption("D", "Multiple Choice"),
                        new AnswerOption("A", "Multiple Choice"),
                        new AnswerOption("2", "Free Text"),
                        new AnswerOption("24", "Free Text"),
                        new AnswerOption("D", "Multiple Choice"),
                        new AnswerOption("A", "Multiple Choice"),
                        new AnswerOption("7", "Free Text"),
                        new AnswerOption("123", "Free Text"),
                        new AnswerOption("D", "Multiple Choice"),
                        new AnswerOption("A", "Multiple Choice"),
                        new AnswerOption("3", "Free Text"),
                        new AnswerOption("123", "Free Text"),
                        new AnswerOption("D", "Multiple Choice"),
                        new AnswerOption("A", "Multiple Choice"),
                        new AnswerOption("5", "Free Text"),
                        new AnswerOption("123", "Free Text"),
                        new AnswerOption("D", "Multiple Choice")
                    );

        GridPane gridpane = new GridPane();

        gridpane.setPadding(new Insets(5));

        gridpane.setHgap(5);

        gridpane.setVgap(5);

        answerSelectList = FXCollections.observableArrayList("A", "B", "C", "D", "INVALID_ANSWER", "NO_ANSWER");

        answerCol = new TableColumn();
        answerCol.setText("Answers");
        answerCol.setMinWidth(210);
        answerCol.setEditable(true);
        answerCol.setCellValueFactory(new PropertyValueFactory("answers"));

        answerCol.setCellFactory( new Callback<TableColumn<String, String>, TableCell<String, String>>() {
            @Override
            public TableCell<String, String> call(TableColumn<String, String> arg0) {
                return new anyMethod();
            }
        });

        answerTypeCol = new TableColumn();

        answerTypeCol.setText("Answers Type");
        answerTypeCol.setMinWidth(210);
        answerTypeCol.setEditable(true);
        answerTypeCol.setCellValueFactory(new PropertyValueFactory("answersType"));

        table.setItems(data);
        table.getColumns().addAll(answerCol, answerTypeCol);

        StackPane root = new StackPane();
        Scene scene =new Scene(root, 500, 550);
        gridpane.add(table, 1, 5,1,20 );
        root.getChildren().addAll(gridpane);
        primaryStage.setScene(scene);
        primaryStage.show();
   }


    private class anyMethod extends TableCell <String, String>{

        public anyMethod(){

            comboBox = new ComboBox();
            textField = new TextField();
            comboBox.setItems(answerSelectList);
        }

        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
                 if (empty) {
                setText(null);
               setGraphic(null);
                System.out.println("In empty");
             } else {
                if( getTableView().getColumns().get(1).getCellData(getIndex()).toString().startsWith("M")){

                 System.out.println("Making ComboBox");
                 setGraphic(comboBox);
                }
                else{
                    setGraphic(textField);
                }
             }

        }

    }


    public static class AnswerOption {
        private final SimpleStringProperty answers;
        private final SimpleStringProperty answersType;


        private AnswerOption(String answers, String answersType) {
            this.answers = new SimpleStringProperty(answers);
            this.answersType = new SimpleStringProperty(answersType);
        }

        public String getAnswers() {
            return answers.get();
        }
        public void setAnswers(String answers) {
            this.answers.set(answers);
        }

        public String getAnswersType() {
            return answersType.get();
        }
        public void setAnswersType(String answersType) {
            this.answersType.set(answersType);
        }
    }
}
公共类ComboBoxRefresh扩展应用程序{
表列应答器类型;
表列回答;
可观察回答者选择列表;
组合框组合框;
TextField;
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共作废开始(最终阶段初级阶段){
setTitle(“具有多个组件的表格单元格”);
TableView table=新TableView();
table.setEditable(true);
最终可观测列表数据=
FXCollections.observableArrayList(
新答案选项(“A”、“多项选择”),
新答案选项(“1”,“自由文本”),
新答案选项(“78”,“自由文本”),
新答案选项(“D”、“多项选择”),
新答案选项(“A”、“多项选择”),
新答案选项(“2”,“自由文本”),
新答案选项(“24”,“自由文本”),
新答案选项(“D”、“多项选择”),
新答案选项(“A”、“多项选择”),
新答案选项(“7”,“自由文本”),
新答案选项(“123”,“自由文本”),
新答案选项(“D”、“多项选择”),
新答案选项(“A”、“多项选择”),
新答案选项(“3”,“自由文本”),
新答案选项(“123”,“自由文本”),
新答案选项(“D”、“多项选择”),
新答案选项(“A”、“多项选择”),
新答案选项(“5”,“自由文本”),
新答案选项(“123”,“自由文本”),
新答案选项(“D”、“多项选择”)
);
GridPane GridPane=新建GridPane();
设置填充(新插图(5));
网格窗格。setHgap(5);
gridpane.setVgap(5);
answerSelectList=FXCollections.observearraylist(“A”、“B”、“C”、“D”、“无效答案”、“无答案”);
answerCol=新表列();
答案:setText(“答案”);
应答器设置最小宽度(210);
应答设置可编辑(真);
回答:setCellValueFactory(新属性价值工厂(“回答”);
answerCol.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn arg0){
返回新的anyMethod();
}
});
answerTypeCol=新表列();
应答类型col.setText(“应答类型”);
应答类型设置最小宽度(210);
answerTypeCol.setEditable(真);
answerTypeCol.setCellValueFactory(新属性ValueFactory(“answersType”));
表2.设置项目(数据);
table.getColumns().addAll(answerCol,answerTypeCol);
StackPane root=新的StackPane();
场景=新场景(根,500550);
gridpane.add(表1,5,1,20);
root.getChildren().addAll(gridpane);
初级阶段。场景(场景);
primaryStage.show();
}
私有类anyMethod扩展了TableCell{
公共方法(){
comboBox=新的comboBox();
textField=新的textField();
comboBox.setItems(应答选择列表);
}
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
设置图形(空);
System.out.println(“In-empty”);
}否则{
if(getTableView().getColumns().get(1).getCellData(getIndex()).toString().startsWith(“M”)){
System.out.println(“制作组合框”);
设置图形(组合框);
}
否则{
设置图形(文本字段);
}
}
}
}
公共静态类应答选项{
私人最终的简单财产回答;
私人最终简单财产责任;
专用应答选项(字符串应答、字符串应答类型){
this.answers=新的SimpleStringProperty(answers);
this.answersType=新的SimpleStringProperty(answersType);
}
公共字符串getAnswers(){
返回答案。get();
}
公共无效集合答案(字符串答案){
此.answers.set(answers);
}
公共字符串getAnswersType(){
return answersType.get();
}
public void setAnswersType(字符串answersType){
此.answersType.set(answersType);
}
}
}

您应该使combobox和textfield成为anyMethod类的成员,因为在滚动updateItem()之后,会将唯一存在的combobox设置为每个单元格,从而导致视觉损坏。

好的,我已使textfield和combobox成为anyMethod类的成员。但textfield仍然自动隐藏。我已更改代码如下。if(empty){setText(null);setGraphic(null);}else{if(getTableView().getColumns().get(1).getCellData(getIndex()).toString().startsWith(“M”){ComboBox combo=new ComboBox();combo.setItems(NameChoiceList);setGraphic(combo);setVisible(true);}else{TextField text=new TextField();setGraphic(text);text.setText(“hello”);setVisible(true);}}@Ifran能否提供您的新代码?最好是通盘考虑。