ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[Kotlin] 用Kotlin和Swing实现VB6中的MsgBox

2022-02-03 16:00:50  阅读:258  来源: 互联网

标签:String title Kotlin param VB6 text owner MsgBox


VB6中的MsgBox

VB6 中有一个十分好用的过程MsgBox

MsgBox(Prompt, Button, Title,)

可以用来编写一些简单的对话框

Private Sub Command1_Click()
    Dim x As Integer
    x = MsgBox("你好", vbYesNo)
    If x = VbMsgBoxResult.vbYes Then
        MsgBox ("你点击了确定")
    End If
End Sub

在Swing中,并没有这个函数,我们来模拟一个

/**
 * @author Winterreisender
 * @license Apache-2.0
 */
import java.awt.BorderLayout
import java.util.concurrent.Semaphore
import javax.swing.*

// 垃圾Java,连MsgBox都没有

object MsgBox {
    /**
     * MsgBox not like VB with callback
     *
     * 垃圾Java,连MsgBox都没有
     *
     * @author Winterreisender
     * @param text The text to show in Dialog
     * @param title The title of JDialog window
     * @param owner The parent JFrame of Dialog
     * @param yesText The text of "Yes" button
     * @param noText The text of "No" button
     * @param onYes callback when "Yes" clicked
     * @param onNo callback when "No" clicked
     * @return A showing JDialog with Yes and No button
     */
    fun msgBoxAsync(
        text: String,
        title: String = "",
        owner: JFrame? = null,
        yesText: String = "确认",
        noText: String? = null,
        onYes: () -> Unit = {},
        onNo: () -> Unit = {}
    ) = JDialog(owner, title).apply {
        layout = BorderLayout()
        defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
        setLocationRelativeTo(owner)


        JLabel(text, JLabel.CENTER)
            .also { add(it, BorderLayout.CENTER) }

        Box(BoxLayout.X_AXIS).apply {
            Box.createHorizontalGlue().also(::add)
            JButton(yesText).apply {
                pack()
                addActionListener {
                    onYes()
                    dispose()
                }
            }.also(::add)
            if (noText != null) JButton(noText).apply {
                pack()
                addActionListener {
                    onNo()
                    dispose()
                }
            }.also(::add)
            Box.createHorizontalGlue().also(::add)


            pack()
            isVisible = true
        }.also { add(it, BorderLayout.SOUTH) }
    }.apply { pack(); isVisible = true }

    /**
     * Synchronized MsgBox like VB
     *
     * 垃圾Java,连MsgBox都没有
     *
     * @author Winterreisender
     * @param text The text to show in Dialog
     * @param title The title of JDialog window
     * @param owner The parent JFrame of Dialog
     * @param yesText The text of "Yes" button
     * @param noText The text of "No" button
     * @return A showing JDialog with Yes and No button
     */
    fun msgBox (
        text: String,
        title: String = "",
        owner: JFrame? = null,
        yesText: String = "确认",
        noText: String = "取消"
    ) :Boolean {
        var r: Boolean = false
        val sem = Semaphore(0)
            MsgBox.msgBoxAsync(text, title, owner, yesText, noText, { r = true;sem.release() }, { r = false; sem.release() })
        sem.acquire()
        return r
    }
}

fun main() {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel")
	val r = MsgBox.msgBox("Text")
	if(r) {
		println("你点击了确定")
	}
    
}

标签:String,title,Kotlin,param,VB6,text,owner,MsgBox
来源: https://www.cnblogs.com/winterreisender/p/15861583.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有