2016-11-17 179 views
4

在我的javafx项目中,我得到了一个包含多个值的组合框。当我的应用程序开始时,我执行以下操作:更新javafx中的gridPane

gui.course_P = new ComboBox<String>(); 
    for (int i = 1; i < gui.columns.size(); i++) { 
     gui.course_P.getItems().add(gui.columns.get(i)); 
} 

gui.createTestButtonPane.add(gui.course_P, 2, 1); 

其中gui.columns是一个字符串列表。

同时在应用程序中可以更改此值。然而,因为我已经将这个组合框添加到我的GridPane,然后当这个值改变(gui.columns)时,我的场景新的值没有显示在组合框。因为我已经添加了旧的gui.course。有没有办法用新的gui.course_P更新createTestButtonPane?

编辑:我所试图做的是对的组合框添加值上的监听器,然后重新添加它到gridPane:

String temp1 = course_name.getText(); 
gui.course_P = new ComboBox<String>(); 
gui.course_P.getItems().add(temp1);  
//gui.createTestButtonPane.add(gui.course_P, 2, 1); 

该课程是正确添加到组合框,但随后当我再次将组合框添加到gridpane时,我有两个comboBox。我想要的只是将gui.course更新到我的gridPane。

EDIT2:我跟着我的代码的答案帖子的例子。

//gui.course_P = new ComboBox<>(gui.columns); 
    gui.course_P = new ComboBox<String>(); 
    for (int i = 1; i < gui.columns.size(); i++) { 
     gui.course_P.getItems().add(gui.columns.get(i)); 
    } 

问题是,我想从列表中除了第一个元素以外的所有东西。 当我使用gui.course_P = new ComboBox<>(gui.columns);而不是for循环时,它正在工作,但由于某种原因,我有两次列表中的元素,而且我还得到了第一个项目。我可以在没有第一项的情况下添加它吗?

+0

添加组件或项监听组合框,如果你再更改值删除旧,并添加新的 – XtremeBaumer

+0

添加我的问题。我在监听器上添加新值,但是我想在监听器上更新gridPane的内容。 –

+0

你可以删除旧的/覆盖它吗? – XtremeBaumer

回答

2

这对我来说很好。无论何时按下按钮,都会将新项目添加到组合框中。我只是使用了一个ObservavleList<String>作为组合框的item属性。无需清除或重新添加。

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ComboBox; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

public class ComboBoxTest extends Application { 
    private ObservableList<String> source = FXCollections.observableArrayList(); 

    @Override 
    public void start(Stage primaryStage) { 
     Pane root = createPane(); 
     primaryStage.setScene(new Scene(root)); 
     primaryStage.show(); 
    } 

    private Pane createPane() { 
     GridPane pane = new GridPane(); 
     Button addButton = new Button("add new item"); 
     addButton.setPrefWidth(150); 
     addButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       source.add("Item" + source.size()); // editing the source 
      } 
     }); 

     ComboBox<String> comboBox = new ComboBox<>(source); 

     pane.add(addButton, 1, 0); 
     pane.add(comboBox, 1, 1); 
     pane.setPrefHeight(200); 
     pane.setPrefWidth(200); 
     return pane; 
    } 

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

0 - 初始状态:

enter image description here

1 - 按钮被按下:

enter image description here

2 - 再次按下按钮:

enter image description here

+0

当我试图将我的ArrayList转换为可观察列表时,出现错误我无法正确导入库 –

+0

不是,它是纯Java 8代码,也许你有错误的Java版本(必须是8),我在代码中包含'impotrs',我希望它有帮助。 'ObservableList',有一个'FXCollections.observableArrayList'的构造函数,它接受'Collection'并因此''ArrayList' – Omid

+0

eclipse导入自动完成不能正常工作。现在它工作正常! –