专栏首页javafx框架tornadofx做了个简易浏览器
原创

做了个简易浏览器

用tornadofx框架做了个简易浏览器

import javafx.concurrent.Worker
import javafx.geometry.Orientation
import javafx.scene.control.ListCell
import javafx.scene.effect.Effect
import javafx.scene.image.Image
import javafx.scene.image.ImageView
import javafx.scene.layout.BorderStrokeStyle.SOLID
import javafx.scene.layout.Priority
import javafx.scene.paint.Color
import javafx.scene.text.FontSmoothingType
import javafx.scene.web.WebHistory
import javafx.scene.web.WebView
import javafx.stage.FileChooser
import tornadofx.*
import java.net.MalformedURLException

class MyApp : App(WebviewView::class, Mystyle::class)

class WebviewView : View("webview") {
    val homePageUrl = "http://www.dogedoge.com"
    val pageUrl = stringProperty()
    var wv = webview {
        prefWidth = 470.0
        engine.userAgent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Mobile Safari/537.36"
//            isContextMenuEnabled=false
//            fontScale=1.2
//            zoom=1.2
        fontSmoothingType = FontSmoothingType.GRAY
    }
    val back = booleanProperty(false)
    val forward = booleanProperty(false)
    val history0 = objectProperty<WebHistory.Entry>()
    val history = wv.engine.history

    override val root = borderpane {
        addStageIcon(Image("tornado-fx-logo.png"))
        setPrefSize(800.0, 700.0)
        top = hbox(4) {
            paddingBottom = 10.0
            label("History:"){
                effect
            }
            textfield(pageUrl) {
                hgrow = Priority.ALWAYS
                action {
                    wv.engine.load(text)
                }

            }
            button("Refresh") {
                action {
                    wv.engine.reload()
                }
            }
            button("Go") {
                action {
                    wv.engine.load(pageUrl.value)
                }
            }
            button("Home") {
                action {
                    wv.engine.load(homePageUrl)
                }
            }
            button("Open") {
                action {
                    val selectedFile = chooseFile("Open Web Content", arrayOf(FileChooser.ExtensionFilter("HTML Files", "*.html", "*.htm")))
                    if (selectedFile.isNotEmpty()) {
                        try {
                            wv.engine.load(selectedFile.first().toURI().toURL().toExternalForm())
                        } catch (e: MalformedURLException) {
                            e.printStackTrace()
                        }
                    }
                }
            }
            menubutton("Options") {
                checkmenuitem("Enable Context Menu") {
                    isSelected = true
                    wv.contextMenuEnabledProperty().bind(selectedProperty())
                }
                menu("Font Scale") {
                    textProperty().bind(stringProperty("Font Scale ").concat(wv.fontScaleProperty().multiply(100.0)).concat("%"))
                    item("Normal") {
                        action {
                            wv.fontScale = 1.0
                        }
                    }
                    item("10% Bigger") {
                        action {
                            wv.fontScale += 0.1
                        }
                    }
                    item("10% Smaller") {
                        action {
                            wv.fontScale -= 0.1
                        }
                    }
                }
                menu("Font Smoothing") {
                    togglegroup {
                        radiomenuitem("GRAY") {
                            isSelected = true
                            action {
                                wv.fontSmoothingType = FontSmoothingType.GRAY
                            }
                        }
                        radiomenuitem("LCD") {
                            action {
                                wv.fontSmoothingType = FontSmoothingType.LCD
                            }
                        }
                    }

                }
                menu("Zoom") {
                    textProperty().bind(stringProperty("Zoom ").concat(wv.zoomProperty().multiply(100.0)).concat("%"))
                    item("Normal") {
                        action {
                            wv.zoom = 1.0
                        }
                    }
                    item("10% Bigger") {
                        action {
                            wv.zoom += 0.1
                        }
                    }
                    item("10% Smaller") {
                        action {
                            wv.zoom -= 0.1
                        }
                    }
                }
                checkmenuitem("Enable JavaScript") {
                    isSelected = true
                    wv.engine.javaScriptEnabledProperty().bind(selectedProperty())
                }
            }

            button("Back") {
                enableWhen(back)
                action {
                    history.go(-1)
                }
            }
            button("Forward") {
                enableWhen(forward)
                action {
                    history.go(1)
                }
            }
            label("History:")
            combobox(history0, history.entries) {
                prefWidth = 150.0
                setCellFactory {
                    object : ListCell<WebHistory.Entry>() {
                        public override fun updateItem(item: WebHistory.Entry?, empty: Boolean) {
                            super.updateItem(item, empty)
                            if (empty) {
                                text = null
                                graphic = null
                            } else {
                                val pageTitle = item?.title
                                text = pageTitle
                            }
                        }
                    }
                }
                setOnAction {
                    val currentIndex = history.currentIndex
                    val selectedEntry = value
                    val selectedIndex = items.indexOf(selectedEntry)
                    val offset = selectedIndex - currentIndex
                    history.go(offset)
                }
            }
        }
        center {
            add(wv)
            run { wv.engine.load(homePageUrl) }

            wv.engine.loadWorker.stateProperty().addListener { _, _, newState ->
                if (newState == Worker.State.SUCCEEDED)
                    title = wv.engine.title
            }
            wv.engine.locationProperty().addListener { _, _, newValue ->
                pageUrl.value = newValue
            }
//            wv.engine.titleProperty().addListener { _, _, newValue ->
//               title = newValue
//            }
            history.currentIndexProperty().addListener { _, _, newValue ->
                val currentIndex = newValue.toInt()
                back.value = currentIndex > 0
                forward.value = currentIndex < history.entries.size
            }
        }
    }
}

class Mystyle : Stylesheet() {
    init {
        root {
            padding = box(10.px)
            borderWidth += box(2.px)
            borderInsets += box(5.px)
            borderRadius += box(5.px)
//            borderColor += box(Color.BLUE)
//            borderStyle += SOLID

        }
    }
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 二维码生成小工具,采用javafx框架tornadofx实现界面开发

    用户6167008
  • javafx框架tornadofx画个心形

    用户6167008
  • 吃鱼小游戏,可以让小朋友练习键盘方向键和鼠标,采用javafx框架tornadofx实现

    用户6167008
  • 二维码生成小工具,采用javafx框架tornadofx实现界面开发

    用户6167008
  • javafx框架tornadofx画个心形

    用户6167008
  • 吃鱼小游戏,可以让小朋友练习键盘方向键和鼠标,采用javafx框架tornadofx实现

    用户6167008
  • Spring Security 案例实现和执行流程剖析

    Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架。除了常规的认证(Authentica...

    朝雨忆轻尘
  • Spring Boot使用Netty SocketIO实现WebIM功能

    本文转载自:Spring Boot使用Netty SocketIO实现WebIM功能

    三产
  • 一个简单的toolabar结合drawlayout使用方法

    本文实例为大家分享了toolabar结合drawlayout使用方法,供大家参考,具体内容如下

    砸漏
  • spark ML算法之线性回归使用

    转载请务必注明原创地址为:http://dongkelun.com/2018/04/09/sparkMlLinearRegressionUsing/

    董可伦

扫码关注云+社区

领取腾讯云代金券