2009-07-16 12 views
8

En respuesta a un previous question sobre cómo lograr un cierto efecto con Swing, fui dirigido a JDesktopPane y JInternalFrame. Desafortunadamente, scala.swing no parece tener ningún contenedor para ninguna de las clases, así que me queda extenderlo.¿Cómo extiendo scala.swing?

¿Qué debo saber y hacer para hacer envoltorios mínimamente utilizables para estas clases, para usar con y por scala.swing, y cuáles serían los pasos adicionales para hacer la mayoría de ellos?

Editar:

Como sugerido por alguien, permítanme explicar el efecto que pretendo lograr. Mi programa controla las apuestas de lotería (personales). Así que tengo una serie de entradas diferentes, cada una de las cuales puede tener varias apuestas diferentes y validez variable.

La idea es mostrar cada uno de estos tickets en un "espacio" separado, y JInternalFrames parece ser justo lo que quiero, y dejar que las personas creen nuevos tickets, cargarlos desde archivos, guardarlos en archivos y, en general, verificarlos o editando la información en cada uno.

Además de eso, debe haber un espacio para mostrar los resultados de la lotería, y tengo la intención de desarrollar el programa para poder controlar las apuestas colectivas, quienes contribuyeron con cuánto y cómo se dividirá cualquier ganancia. No he considerado la interfaz para eso todavía.

Tenga en cuenta que:

  • no puedo "sólo tiene que utilizar" las clases de Java, y aún así aprovechar al máximo las características de oscilación Scala. Las respuestas en la pregunta anterior ya me dicen cómo hacer lo que quiero con las clases de Java, y eso no es lo que estoy preguntando aquí.

  • Leer el código fuente de las clases existentes de scala.swing para aprender a hacerlo es el trabajo que trato de evitar con esta pregunta.

Respuesta

0

Puede importar todas las bibliotecas de Java directamente en su código scala.

Pruebe la sección del tutorial de scala: "interacción con Java".

Java in scala

0

¿Qué tipo de características scala está tratando de usar con ellas? Eso podría ayudar a llegar con una respuesta. Es decir. - ¿Qué intentas hacer con eso, posiblemente en Java? Entonces podemos tratar de encontrar una forma más agradable de hacerlo con Scala y/o crear un contenedor para las clases que hará que lo que está tratando de hacer sea aún más fácil.

+0

Bastante. Voy a enmendar mi pregunta. –

+0

Gracias por la información adicional, pero me refiero a un nivel más técnico, es decir, programáticamente, ¿qué quieres hacer con la clase Swing? –

3

Puede considerar el mecanismo de "conversiones implícitas" de Scala.Se podría hacer algo como esto:

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

Ahora definir una clase RichJInternalFrame() que toma un JInternalFrame, y tiene todos los métodos desea extender JInternalFrame con, por ejemplo:

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

Este crea un nuevo método showThis que solo llama a show en JInternalFrame. Ahora puede llamar a este método en un JInternalFrame:

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

Scala se convertirá automáticamente en un jif RichJInternalFrame y dejar que se llama a este método en él.

+1

Quizás debería haber sido más explícito en la descripción de mi pregunta. Como dice la pregunta en sí, quiero extender scala.swing. ¿Cómo extiendo * scala.swing *? ¡Una respuesta que ni siquiera menciona un solo rasgo, clase o método de scala.swing no puede responder la pregunta! –

0

En JRuby, podría mezclar uno (o más) rasgos en JDesktopPane o JInternalFrame en lugar de extenderlos. De esta forma no tendrías que envolver las clases, solo usar los objetos existentes. Hasta donde yo sé, esto no es posible con los rasgos de Scala.

Afortunadamente, hay una solución, casi tan flexible como la de Ruby: lexically open classes. Este artículo de blog da una excelente introducción, en mi humilde opinión.

Cuestiones relacionadas