[Kotlin] 在IDEA Swing设计器中间接使用Kotlin


IDEA Swing设计器不支持Kotlin,可以通过以下方法间接使用Kotlin与Java互操作来实现。

步骤

1. 创建一个新的Java或Kotlin工程

2. 修改IDEA的Gradle设置,改用IDEA构建

(如果你用的是IntelliJ构建系统,可以忽略本步骤,Maven没有尝试过)
设置路径为:File->Setting->Build,Execution,Deployment->Build Tools->Gradle->Build and run using
可以参考这篇文章

3. 创建Gradle源文件目录

Kotlin或Java皆可


4. 创建Swing GUI窗体


5. 给Panel命名

6. 添加一个Button,创建Java侦听器


按Alt+Insert创建窗体的main方法

8. 创建Kotlin控制器类,用来编写回调函数

创建Kotlin文件,如果你是Java项目,那么应当遵循IDEA的引导完成Kotlin配置

// TestController.kt
object TestController {
    @JvmStatic
    fun onButton1Clicked() {
        println("clicked")
    }
}

9. 在Java绑定类中调用Kotlin方法

让Kotlin可以控制更多内容

修改绑定类

并将JForm添加到成员变量,然后将所有的private控件成员改为public
这一步主要是为了让Kotlin控制器能够访问JForm和所有控件

然后将绑定类和事件作为参数传给Kotlin

import java.awt.event.ActionEvent

object TestController {
    @JvmStatic
    fun onButton1Clicked(form: TestForm,e : ActionEvent) {
        println("clicked")
        form.button1.text = "clicked"
    }
}
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestForm {
    public JPanel panel1;
    public JButton button1;

    public TestForm() {
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                TestController.onButton1Clicked(TestForm.this,e);
            }
        });
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("TestForm");
        frame.setContentPane(new TestForm().panel1);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

让Kotlin访问JForm

现在只剩JForm是Kotlin无法访问的,事实上就算Java代码也不能直接访问,所以需要费点功夫。

我们要把自动生成的main方法改动一下,将frame作为form的成员

    public JFrame frame;
    public void loadFrame() {
        frame = new JFrame("TestForm");
        frame.setContentPane(panel1); // 这里要改一下
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        new TestForm().loadFrame();
    }

然后便可以在Kotlin中修改frame了

import java.awt.Dimension
import java.awt.event.ActionEvent

object TestController {
    @JvmStatic
    fun onButton1Clicked(form: TestForm,e : ActionEvent) {
        println("clicked")
        form.button1.text = "clicked"
        form.frame.size = Dimension(400,300)
    }
}

完整示例: https://files.cnblogs.com/files/blogs/724104/ideaSwingDesignerKtDemo.zip