有没有办法使用controlfx jar

时间:2017-03-24 17:59:26

标签: javafx javafx-2 javafx-8

我有一个自动填充的文本字段,我想在该列表中出现的每个项目附近显示按钮

这是我的代码

 List<String> s = ms.getUsernames(ms.getUser(7).getListamis());
    TextFields.bindAutoCompletion(txtsearch, s);

这是方法getusernames

      public List<String> getUsernames(String list_amis) {
       List<String> ls = new ArrayList<>();
       String [] idmember = list_amis.split("/");
        for (String i : idmember) {

            ls.add(getUser(Integer.parseInt(i)).getUsername());

    }
    return ls;
}

这是我的输出 enter image description here 我想在测试附近添加一个按钮,因此我可以获得其ID

1 个答案:

答案 0 :(得分:1)

这是我提出的解决方案。肯定有更好的方式更优雅,更好,但我想这适用于许多情况。但是,您必须对ListView的大小做一些事情,并且我没有在出现的ListView可能会改变UI其余部分设计的环境中对此进行测试。我建议将整个事情放入PopOver或其他东西。

import java.util.function.Predicate;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;

public class NewFXMain extends Application {

    @Override
    public void start(Stage primaryStage) {

        ObservableList<String> list = FXCollections.observableArrayList("one","two","three");
        FilteredList<String> filteredList = new FilteredList<>(list);

        VBox box = new VBox();
        TextField textField = new TextField();
        textField.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                filteredList.setPredicate(new Predicate<String>() {
                    @Override
                    public boolean test(String s){
                        return s.toLowerCase().contains(newValue.toLowerCase());
                    }
                });
            }
        });

        ListView listView = new ListView();
        listView.setItems(filteredList);
        listView.visibleProperty().bind(textField.textProperty().isNotEmpty());
        listView.setCellFactory(new Callback() {
            @Override
            public Object call(Object param) {
                ListCell cell = new ListCell(){
                    @Override
                    public void updateItem(Object item, boolean empty){
                        if(item != null && !empty){
                            super.updateItem(item, empty);
                            HBox contentBox = new HBox();
                            Label label = new Label(item.toString());
                            Button button = new Button("delete");
                            HBox separator = new HBox();
                            HBox.setHgrow(separator, Priority.ALWAYS);
                            button.setOnAction(new EventHandler<ActionEvent>() {
                                @Override
                                public void handle(ActionEvent event) {
                                    System.out.println(item);
                                }
                            });
                            contentBox.getChildren().addAll(label, separator, button);
                            setGraphic(contentBox);
                        }else{
                            setText(null);
                            setGraphic(null);
                        }
                    }
                };
                return cell;
            }
        });
        box.getChildren().addAll(textField,listView);
        StackPane root = new StackPane();
        root.getChildren().add(box);
        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Autocomplete");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}