0

我刚开始和锡兰一起玩,我真的很喜欢...

但是我在使用 Swing 时遇到了这个问题......我想使用 BorderLayout 将组件添加到 JPanel。

这是我正在使用的代码:

import javax.swing {
  JLabel,
  SwingUtilities { invokeLater },
  JFrame { exitOnClose = \iEXIT_ON_CLOSE },
  JButton,
  JPanel
}
import java.lang { Runnable }
import java.awt {
  Dimension,
  BorderLayout { north = \iNORTH, center = \iCENTER }
}

class MySwingApp() satisfies Runnable {

  shared actual void run() {
    value frame = JFrame();
    frame.title = "Renato app";
    frame.defaultCloseOperation = exitOnClose;
    frame.size = Dimension(300, 200);
    frame.setLocationRelativeTo(null);

    value panel = JPanel();
    panel.layout = BorderLayout();

    frame.add(panel);

    panel.add(JLabel("Hello world"), north);
    panel.add(JButton("Click me"), center);
    frame.visible = true;
  }

}

错误是:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: cannot add to layout: constraint must be a string (or null)
at java.awt.BorderLayout.addLayoutComponent(BorderLayout.java:426)
at java.awt.Container.addImpl(Container.java:1120)
at java.awt.Container.add(Container.java:966)
at firstModule.MySwingApp.run(run.ceylon:52)

我运行应用程序:

invokeLater(MySwingApp());

在我看来,这似乎是在锡兰映射字符串的问题?!​​?任何人都可以看到我做错了什么(作为锡兰的新手,我不会感到惊讶)??

4

1 回答 1

2

这里发生的情况是,Container.add()第二个参数被声明为 an Object,而不是 a java.lang.String,因此 Ceylon 编译器没有意识到需要对 Ceylon 进行拆箱String。根据方法的签名 anyObject是可以接受的,只是方法的实现决定它实际上需要一个 Java 字符串。

在以下情况下,您可以使用模块中的javaString()函数ceylon.interop.java将 Ceylon 转换String为 Java String

panel.add(JLabel("Hello world"), javaString(north));
panel.add(JButton("Click me"), javaString(center));
于 2013-11-20T11:24:00.520 回答