如何在组合框中添加删除按钮 [英] how to add remove button in combobox

查看:164
本文介绍了如何在组合框中添加删除按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个带有删除按钮的ComboBox,如下图所示:

I would like to create a ComboBox with the remove button like the picture below:

图片使用Java Swing,我不知道如何使用JavaFX。我想创建两个ComboBox(a,b)。当我点击ComboBox a中的cross时,我想删除一个项目并将此项目添加到ComboBox b,然后将ComboBox b添加到其中。

The picture uses Java Swing, and I don't know how to do this with JavaFX. I would like to create two ComboBoxes (a,b). When I click the "cross" in ComboBox a, I would like to remove a's item and add this item to ComboBox b, and ComboBox b so on.

ComboBox a:
(1)点击项目然后将其从a中删除并添加b

ComboBox b:
(1)点击项目然后做某事(例如:打印项目)

(2)点击交叉然后从b中删除它并添加

package UnitTest;

import Peer.Peer_Manager;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.chart.XYChart;
import javafx.geometry.Insets;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;

import javafx.scene.text.Text;

public class temp extends Application {
    final int height = 200;
    final int weight = 300;
    final int offset = 5;
    Peer_Manager p_management;
    XYChart.Series series_hop;
    XYChart.Series series_gd;

    @Override
    public void start(Stage primaryStage) {
        VBox vbox = new VBox(); 
        vbox.setPadding(new Insets(5, 5, 5, 5)); 
        vbox.setStyle("-fx-background-color: CORNSILK;");

        Scene scene = new Scene(vbox, weight, height);
        primaryStage.setScene(scene);

        HBox hbBtn = new HBox();
        Text t1=new Text("  A:");
        Text t2=new Text("  B:");

        String[] filename = {"A","B","C"};//conf.load_all();
        ComboBox<String> cb = new ComboBox<String>();
        cb.setItems(FXCollections.observableArrayList(filename));
        cb.setVisibleRowCount(10);

        ComboBox<String> cb2 = new ComboBox<String>();
        cb.setVisibleRowCount(10);

        vbox.getChildren().add(hbBtn);
        hbBtn.getChildren().add(t1);
        hbBtn.getChildren().add(cb);
        hbBtn.getChildren().add(t2);
        hbBtn.getChildren().add(cb2);

        cb.setOnAction(e -> { 
            try {
                Object object = cb.getValue();
                if (object != null) {
                   cb2.getItems().add(object);
                   cb.getSelectionModel().clearSelection();
                   cb.getItems().remove(object);
                }
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        });

        //would like to do something(ex:print item),but don't remove
        //add the "cross" beside items,click "cross" to remove item and add on cb
        cb2.setOnAction(e -> {
            try {
                Object object = cb2.getValue();
                System.out.println(object);
                if (object != null) {
                    cb1.getItems().add(object);
                    cb2.getSelectionModel().clearSelection();
                    cb2.getItems().remove(object);
                }

            } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            }
        });
        primaryStage.setTitle("SimulatorFX");
        primaryStage.show();
    }

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


推荐答案

正确的方法是使用 CellFactory 并创建包含您希望拥有的元素的图形节点。下面是一个示例:

The correct way is to use a CellFactory and create graphic nodes that contain the elements you wish to have. Here is an example:

public void start(Stage primaryStage) throws Exception {
    ComboBox<String> cba = new ComboBox<>();
    ComboBox<String> cbb = new ComboBox<>();
    cba.getItems().addAll("A", "B", "C");
    cbb.getItems().addAll("123", "456", "789");

    // Set a cell factory for ComboBox A. A similar thing should be done for B. 
    cba.setCellFactory(lv ->
            new ListCell<String>() {
                // This is the node that will display the text and the cross. 
                // I chose a hyperlink, but you can change to button, image, etc. 
                private HBox graphic;

                // this is the constructor for the anonymous class.
                {
                    Label label = new Label();
                    // Bind the label text to the item property. If your ComboBox items are not Strings you should use a converter. 
                    label.textProperty().bind(itemProperty());
                    // Set max width to infinity so the cross is all the way to the right. 
                    label.setMaxWidth(Double.POSITIVE_INFINITY);
                    // We have to modify the hiding behavior of the ComboBox to allow clicking on the hyperlink, 
                    // so we need to hide the ComboBox when the label is clicked (item selected). 
                    label.setOnMouseClicked(event -> cba.hide());

                    Hyperlink cross = new Hyperlink("X");
                    cross.setVisited(true); // So it is black, and not blue. 
                    cross.setOnAction(event ->
                            {
                                // Since the ListView reuses cells, we need to get the item first, before making changes.  
                                String item = getItem();
                                System.out.println("Clicked cross on " + item);
                                if (isSelected()) {
                                    // Not entirely sure if this is needed. 
                                    cba.getSelectionModel().select(null);
                                }
                                // Remove the item from A and add to B. You can add any additional logic in here. 
                                cba.getItems().remove(item);
                                cbb.getItems().add(item);
                            }
                    );
                    // Arrange controls in a HBox, and set display to graphic only (the text is included in the graphic in this implementation). 
                    graphic = new HBox(label, cross);
                    graphic.setHgrow(label, Priority.ALWAYS);
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                }

                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty) {
                        setGraphic(null);
                    } else {
                        setGraphic(graphic);
                    }
                }
            });

    // We have to set a custom skin, otherwise the ComboBox disappears before the click on the Hyperlink is registered. 
    cba.setSkin(new ComboBoxListViewSkin<String>(cba) {
        @Override
        protected boolean isHideOnClickEnabled() {
            return false;
        }
    });

    VBox vb = new VBox(cba, cbb);
    primaryStage.setScene(new Scene(vb));
    primaryStage.show();
}

这篇关于如何在组合框中添加删除按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆