class DragFile : View("drag and drop") { val dragFileModel = DragFileModel(this) lateinit var ap: FlowPane override val root = vbox { label("drop txt file to the left and image file to the right and View") { addClass(DragStyles.heading) } label(dragFileModel.lineCountProperty) scrollpane { minHeight = 320.0 hbox { textarea(dragFileModel.fileLinesProperty) { minHeight = 320.0 promptText = "Drop file here" setOnDragOver { event -> dragFileModel.handleDragOver(event) } setOnDragEntered { event -> dragFileModel.handleDragEntered(event) } setOnDragExited { event -> dragFileModel.handleDragExited(event) } setOnDragDropped { event -> dragFileModel.handleDragDropped(event) } } scrollpane { ap = flowpane { vgap = 10.0 hgap = 10.0 prefHeight = 600.0 prefWidth = 800.0 setOnDragOver { event -> dragFileModel.handleDragOver(event) } setOnDragEntered { event -> dragFileModel.handleDragEntered(event) } setOnDragExited { event -> dragFileModel.handleDragExited(event) } setOnDragDropped { event -> dragFileModel.handleImgDropped(event) } } } } } } } class DragFileModel(dragView: DragFile) { val dragView=dragView var lineList: List<String> = emptyList() val fileLinesProperty = SimpleStringProperty(this, "leftLines", "initial") var lines by fileLinesProperty val lineCountProperty = SimpleIntegerProperty(this, "leftLineCount", 0) var lineCount by lineCountProperty fun handleDragOver(event: DragEvent) { event.acceptTransferModes(TransferMode.MOVE) event.consume() } fun handleDragEntered(event: DragEvent) { println("Entered ${event.source}") event.consume() } fun handleDragExited(event: DragEvent) { println("Exited ${event.source}") event.consume() } fun handleDragDropped(event: DragEvent) { println("Dropped ${event.source}") val db = event.dragboard if (db.hasFiles()) { db.files.map { processFile(it.absolutePath) } } event.consume() } fun handleImgDropped(event: DragEvent) { println("Dropped ${event.source}") val db = event.dragboard if (db.hasFiles()) { dragView.ap.add(ImageView(Image(File(db.files.first().toString()).inputStream()))) } event.consume() } private fun processFile(filename: String) { lineList = FileService.getFileLines(filename) lines = lineList.joinToString(separator = "\n") lineCount = lineList.count() } } class FileService { companion object { fun getFileLines(filename: String): List<String> { val lineList = mutableListOf<String>() File(filename).useLines { lines -> lines.forEach { lineList.add(it) } } return lineList } } } class DragStyles : Stylesheet() { companion object { val heading by cssclass() val dropzone by cssclass() } init { label and heading { padding = box(10.px) fontSize = 20.px fontWeight = FontWeight.BOLD } dropzone { borderColor += box( top = Color.RED, right = Color.DARKGREEN, left = Color.ORANGE, bottom = Color.RED ) padding = box(40.px) } } }