Как мне продлить scala.swing? - PullRequest
8 голосов
/ 17 июля 2009

В ответ на предыдущий вопрос о том, как добиться определенного эффекта с помощью Swing, я был направлен в JDesktopPane и JInternalFrame. К сожалению, scala.swing, похоже, не имеет никакой обертки для обоих классов, поэтому мне осталось его расширить.

Что я должен знать и делать для создания минимально используемых оболочек для этих классов, для использования и scala.swing , и какие дополнительные шаги будут сделаны для большинства из них?

Edit:

Как предложил кто-то, позвольте мне объяснить эффект, которого я намерен достичь. Моя программа контролирует (личные) ставки лотереи. Таким образом, у меня есть несколько разных билетов, каждый из которых может иметь несколько разных ставок и разной действительности.

Идея состоит в отображении каждого из этих билетов в отдельном «пробеле», и JInternalFrames кажется именно тем, что я хочу, и позволяет людям создавать новые билеты, загружать их из файлов, сохранять их в файлы, и обычно проверять или редактирование информации в каждом.

Кроме того, должно быть место для отображения результатов лотереи, и я намерен развивать программу, чтобы иметь возможность контролировать коллективные ставки - кто внес вклад, сколько и как любой выигрыш должен быть разделен. Я еще не рассмотрел интерфейс для этого.

Обратите внимание, что:

  • Я не могу "просто использовать" классы Java и все же в полной мере использовать возможности Scala Swing. Ответы на предыдущий вопрос уже говорят мне, как делать то, что я хочу с классами Java, и это не то, что я спрашиваю здесь.

  • Чтение исходного кода существующих классов scala.swing, чтобы узнать, как это сделать - работа, которую я пытаюсь избежать с этим вопросом.

Ответы [ 5 ]

3 голосов
/ 25 июля 2009

Вы могли бы рассмотреть механизм «неявных преобразований» в Scala. Вы могли бы сделать что-то вроде этого:

implicit def enrichJInternalFrame(ji : JInternalFrame) = 
               new RichJInternalFrame(ji)

Теперь вы определяете класс RichJInternalFrame (), который принимает JInternalFrame и имеет любые методы, которыми вы хотите расширить JInternalFrame, например:

class RichJInternalFrame(wrapped : JInternalFrame) {
   def showThis = {
     wrapped.show()
   }
}

Это создает новый метод showThis, который просто вызывает show в JInternalFrame. Теперь вы можете вызвать этот метод для JInternalFrame:

val jif = new JInternalFrame()
println(jif.showThis);

Scala автоматически преобразует jif в RichJInternalFrame и позволяет вам вызывать этот метод для него.

0 голосов
/ 26 июля 2009

В JRuby вы можете смешивать одну (или несколько) черт в JDesktopPane или JInternalFrame вместо их расширения. Таким образом, вам не придется оборачивать классы, а просто использовать существующие объекты. Насколько я знаю, это невозможно с чертами Scala.

К счастью, есть решение, почти такое же гибкое, как у Руби: лексически открытые классы . Эта статья блога дает отличное введение, ИМХО.

0 голосов
/ 17 июля 2009

Возможно, вы сможете использовать источник scala.swing в качестве ссылки, например, http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk/src/swing/scala/swing/Button.scala

0 голосов
/ 18 июля 2009

Какие функции скалы вы пытаетесь использовать с ним? Это может помочь придумать ответ. То есть Что вы пытаетесь сделать с этим, возможно, в Java? Тогда мы можем попытаться придумать лучший способ сделать это с помощью Scala и / или создать оболочку для классов, которая сделает ваши попытки еще проще.

0 голосов
/ 17 июля 2009

Вы можете импортировать все библиотеки Java непосредственно в ваш код Scala.

Попробуйте обучающий раздел по Scala: «взаимодействие с Java».

Java in scala

...