Implement tags bar in JavaFX

后端 未结 4 1522
无人及你
无人及你 2020-12-01 09:38

Demonstration of answer:(answered May 29 at 3:10 am)

**10/7/2016** you can find the code on GitHub

Actual Que

4条回答
  •  暖寄归人
    2020-12-01 10:33

    Here is a basic example of a tag bar (I wrote some code, because I think it's easier to follow). For the additional AutoComplete function you could use e.g. ControlsFx, as fabian already mentioned.

    public class CloseTag extends HBox implements Comparable {
    
        private Label     label;
        private Label     closeIcon;
    
        public CloseTag(String text) {
            setStyle("-fx-padding:8;");
    
            Text icon = GlyphsDude.createIcon(FontAwesomeIcon.TIMES_CIRCLE);
            closeIcon = new Label(null, icon);
    
            label = new Label(text, new StackPane(closeIcon));
            label.setContentDisplay(ContentDisplay.RIGHT);
            getChildren().add(label);
        }
    
        public void setOnCloseAction(EventHandler action) {
            closeIcon.setOnMouseClicked(action);
        }
    
        public String getText() {
            return label.getText();
        }
    
        @Override
        public int compareTo(CloseTag other) {
            return getText().compareTo(other.getText());
        }
    }
    
    
    
    public class TagPane extends FlowPane {
    
        private TextField textField;
    
        public TagPane() {
            setStyle("-fx-padding:8;" + "-fx-hgap:10;");
            setOnMouseClicked(evt -> onMouseClickedd(evt));
    
            textField = new TextField();
            textField.setOnKeyPressed(evt -> onKeyPressed(evt, textField));
        }
    
        private void onMouseClickedd(MouseEvent mouseEvent) {
            if (mouseEvent.getTarget() != this || textField.getParent() != null ) {
                return;
            }
    
            getChildren().add(textField);
            textField.requestFocus();
        }
    
        private void onKeyPressed(KeyEvent evt, TextField textField) {
            if (evt.getCode() == KeyCode.ENTER || evt.getCode() == KeyCode.TAB) {
                createTag(textField.getText());
                textField.clear();
            }
        }
    
        private void createTag(String text) {
            CloseTag tag = new CloseTag(text);
            tag.setOnCloseAction(evt -> removeTag(tag));
            getChildren().remove(textField);
            getChildren().add(tag);
        }
    
        private void removeTag(CloseTag tag) {
            getChildren().remove(tag);
        }
    
    } 
    

提交回复
热议问题