Ceylon String не распознается Swing

Я только начал играть с Ceylon, и мне это очень нравится...

Но я столкнулся с этой проблемой при использовании Swing... Я хочу добавить компоненты в JPanel с помощью BorderLayout.

Это код, который я использую:

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());

Мне кажется, это проблема сопоставления строк на Цейлоне?!? Может ли кто-нибудь увидеть что-то, что я делаю неправильно (будучи новичком на Цейлоне, я не удивлюсь)??


person Renato    schedule 19.11.2013    source источник
comment
Когда я пытаюсь следовать BorderLayout { NORTH } с помощью IDE, я оказываюсь в BorderLayout.north (нижний регистр), который является не строкой, а компонентом!! Может ли это быть источником проблемы??   -  person Renato    schedule 20.11.2013
comment
Даже если я использую Strings North и Center, это все равно не сработает :(   -  person Renato    schedule 20.11.2013
comment
Вы можете использовать String вместо импорта panel.add(JLabel("Hello world"), "North");panel.add(JButton("Click me"), "Center");   -  person alex2410    schedule 20.11.2013


Ответы (1)


Здесь происходит следующее: второй параметр Container.add() объявляется как Object, а не java.lang.String, поэтому компилятор Ceylon не понимает, что нужно распаковывать Ceylon String. В соответствии с сигнатурой метода любой Object приемлем, просто реализация метода решает, что ему действительно нужна строка Java.

Вы можете использовать функцию javaString() из модуля ceylon.interop.java для преобразования Ceylon String в Java String в таких случаях:

panel.add(JLabel("Hello world"), javaString(north));
panel.add(JButton("Click me"), javaString(center));
person Tom Bentley    schedule 20.11.2013
comment
Вау, это имеет смысл ... нужно винить библиотеку Swing за то, что она позволяет передавать любой объект! Приму ответ, когда попробую код! Большое спасибо! - person Renato; 20.11.2013