I convert a pane component in a composable ui by swing pannel
package ui.pdfpreview
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.awt.SwingPanel
import com.geolo.desktop.common.utils.LogUtils
import eu.patrickgeiger.fxpdf.util.PDF
import eu.patrickgeiger.fxpdf.viewer.MinimalViewer
import javafx.application.Platform
import javafx.embed.swing.JFXPanel
import javafx.scene.Scene
import javafx.scene.layout.StackPane
import java.io.File
@Composable
fun PdfPreview(
state: PdfPreviewState,
modifier: Modifier = Modifier,
onCreated: (MinimalViewer) -> Unit = {},
onDispose: (MinimalViewer) -> Unit = {},
) {
var minimalViewer by remember { mutableStateOf<MinimalViewer?>(null) }
val currentOnDispose by rememberUpdatedState(onDispose)
minimalViewer?.let {
DisposableEffect(it) {
onDispose {
LogUtils.i("linlian pdfpreview onDispose minimalViewer=$minimalViewer ")
it.pdf.closeDocument() //关闭文档
currentOnDispose(it)
}
}
}
SwingPanel(factory = {
JFXPanel().also { jfxP ->
Platform.runLater {
val rootVewView = MinimalViewer.MinimalViewerBuilder()
.setPDF(PDF(File(state.filePath)))
.build()
minimalViewer = rootVewView
val root = StackPane()
root.children.add(minimalViewer)
val scene = Scene(root)
onCreated.invoke(rootVewView)
jfxP.scene = scene
}
}
}, modifier = modifier) {jfxpannel->
LogUtils.i("linlian pdfpreview update minimalViewer=$minimalViewer ")
LogUtils.i("linlian pdfpreview update jfxpannel=$jfxpannel ")
}
}
class PdfPreviewState(
val filePath: String
)
and use it in compose
PdfPreview(pdfPreviewState, modifier = Modifier.fillMaxSize(),
onCreated = {
LogUtils.i("linlian PdfPreview onCreated")
}, onDispose = {
LogUtils.i("linlian PdfPreview onDispose")
})
it works well in first time,but after I quit page and open it again,
the code in Platform.runLater won’t run, so the page is blank.
3
add Platform.enterNestedEventLoop(“main”) in the last line of Platform.runLater{}
0