Kotlin/CtrolsFX의 MaskerPane을 사용해 보십시오.

7017 단어 KotlinJavaFX

환경

  • Kotlin 1.0.5
  • JDK 1.8.0_121
  • ControlsFX 8.40.12
  • MaskerPane이란 무엇입니까?


    로드 중인 차량 아이콘과 반투명 마스크 세트를 표시하여 뒤에 있는 컨트롤에 접근할 수 없습니다.JavaFX의 Progress Indicator에만 덮어쓰는 기능이 추가되었을 뿐이지만 더욱 쉽게 사용할 수 있습니다.

    Class MaskerPane
    이번에 우리는 JavaFX에서 준비한 동시 실행 클래스 Task와 함께 사용할 것이다.

    사용 예제 (작업)


    상술한 이미지를 포획하는 컨트롤러 클래스의 실현
    Controller.kt
    class Controller {
    
        @FXML lateinit private var maskerPane: MaskerPane
        @FXML lateinit private var button: Button
    
        @FXML fun onButtonAction(@Suppress("UNUSED_PARAMETER") event: ActionEvent) {
    
            val task = object : Task<String>() {
                override fun call(): String {
                    (0..400).forEach { count ->
                        updateProgress(count.toDouble(), 400.0)   // [1]
                        Thread.sleep(10)
                    }
                    return "done"
                }
            }
    
            maskerPane.progressProperty().bind(task.progressProperty())   // [2]
            maskerPane.visibleProperty().bind(task.runningProperty())     // [3]
            Thread(task).start()
        }
    
    }
    
    1.JavaFX의 Task는void updateProgress(double workDone,double max)라는 방법을 제공합니다.작업 과정에서 작업 Done을 늘리는 동시에 이 방법을 사용해야 합니다. max에 도달할 때까지.
    2. MaskerPane의 progress를 Task의 progress에 따르도록 합니다.
    task.progress 변경 -> maskerPane.progress 추종->maskerPane의 외관 변화
    이런 절차는 실현될 수 있다.진도 자체는 0.0에서 1.0까지의 이중 정밀도값이다.
    3. MaskerPane의 표시 여부가 작업을 수행하고 있는지 여부를 나타내는 값을 따릅니다.
    즉, 작업이 중지되면 MaskerPane이 사라집니다.

    변화


    웹 페이지를 읽는 등 완료 시간을 예측할 수 없을 수도 있습니다.이 경우 다음과 같이 [1] 및 [2]의 행을 삭제할 수 있습니다.

    주위 동기화


    javafx.concurrent 패키지는 이 처리를 라인 안전으로 진행합니다.이 예에서 Task는 progress나 running 값을 다시 쓸 때 자동으로 JavaFX 프로그램 라인을 사용하기 때문에 화면이 엉망진창으로 다시 쓰여도 그림 라인을 의식하지 않습니다.
    ORACLE: JavaFX의 동시

    참고 자료


    ControlsFX: Getting Started (sample)
    ORACLE: Java Sample - Ensemble

    FXML


    Main.fxml
    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.layout.StackPane?>
    <?import org.controlsfx.control.MaskerPane?>
    
    <StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
               prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1"
               fx:controller="maskerpane.Controller">
       <Button fx:id="button" mnemonicParsing="false" onAction="#onButtonAction" text="Button"/>
       <MaskerPane fx:id="maskerPane" visible="false"/>
    </StackPane>
    

    좋은 웹페이지 즐겨찾기