[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