Copiable Label/TextField/LabeledText in JavaFX

后端 未结 2 1825
悲&欢浪女
悲&欢浪女 2020-11-29 09:46

I just want to create copiable label in JavaFX. I have tried to create TextField that have no background, have no focus border and default background color, but I have no su

相关标签:
2条回答
  • 2020-11-29 09:50

    You can create a TextField without the border and background color with css:

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    public class CopyableLabel extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            TextField copyable = new TextField("Copy this");
            copyable.setEditable(false);
            copyable.getStyleClass().add("copyable-label");
    
            TextField tf2 = new TextField();
            VBox root = new VBox();
            root.getChildren().addAll(copyable, tf2);
            Scene scene = new Scene(root, 250, 150);
            scene.getStylesheets().add(getClass().getResource("copyable-text.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    and

    copyable-text.css:

    .copyable-label, .copyable-label:focused {
        -fx-background-color: transparent ;
        -fx-background-insets: 0px ;
    }
    
    0 讨论(0)
  • 2020-11-29 10:13

    This is the solution I used, where there is a small button besides the label to be able to copy the text:

    import javafx.geometry.Insets;
    import javafx.scene.Node;
    import javafx.scene.control.Button;
    import javafx.scene.control.ContentDisplay;
    import javafx.scene.control.Label;
    import org.controlsfx.glyphfont.FontAwesome;
    import org.controlsfx.glyphfont.Glyph;
    
    import java.util.Locale;
    
    public class CopiableLabel extends Label
    {
        public CopiableLabel()
        {
            addCopyButton();
        }
    
        public CopiableLabel(String text)
        {
            super(text);
            addCopyButton();
        }
    
        public CopiableLabel(String text, Node graphic)
        {
            super(text, graphic);
        }
    
        private void addCopyButton()
        {
            Button button = new Button();
            button.visibleProperty().bind(textProperty().isEmpty().not());
            button.managedProperty().bind(textProperty().isEmpty().not());
            button.setFocusTraversable(false);
            button.setPadding(new Insets(0.0, 4.0, 0.0, 4.0));
            button.setOnAction(actionEvent -> AppUtils.copyToClipboard(getText()));
            Glyph clipboardIcon = AppUtils.createFontAwesomeIcon(FontAwesome.Glyph.CLIPBOARD);
            clipboardIcon.setFontSize(8.0);
            button.setGraphic(clipboardIcon);
            setGraphic(button);
            setContentDisplay(ContentDisplay.RIGHT);
        }
    }
    
    0 讨论(0)
提交回复
热议问题