2009-07-16 14 views
8

In risposta a un previous question su come ottenere un determinato effetto con Swing, sono stato indirizzato a JDesktopPane e JInternalFrame. Sfortunatamente, scala.swing non sembra avere alcun wrapper per nessuna delle due classi, quindi non mi resta che estenderlo.Come estendere scala.swing?

Che cosa devo sapere e fare per rendere involucri minimamente utilizzabili per queste classi, da utilizzare con e scala.swing, e quali sarebbero i passi aggiuntivi per rendere la maggior parte di loro?

Edit:

Come suggerito da qualcuno, mi permetta di spiegare l'effetto che intendo realizzare. Il mio programma controlla le puntate della lotteria personale. Quindi ho un numero di biglietti diversi, ognuno dei quali può avere un numero di scommesse diverse e diverse validità.

L'idea è visualizzare ciascuno di questi ticket in uno "spazio" separato, e JInternalFrames sembra essere proprio quello che voglio, e permettere alle persone di creare nuovi ticket, caricarli da file, salvarli in file e in generale controllare o modificando le informazioni in ciascuna.

Oltre a questo, ci deve essere uno spazio per visualizzare i risultati della lotteria, e ho intenzione di evolvere il programma per essere in grado di controllare le scommesse collettive - chi ha contribuito con quanto e come ogni vincita dovrebbe essere divisa. Non ho ancora considerato l'interfaccia per quello.

prega di notare che:

  • non posso "basta usare" le classi Java, e ancora sfruttare appieno le caratteristiche di swing Scala. Le risposte nella domanda precedente mi dicono già come fare ciò che voglio con le classi Java, e non è quello che sto chiedendo qui.

  • Leggere il codice sorgente delle classi esistenti di scala.swing per imparare come farlo è il lavoro che sto cercando di evitare con questa domanda.

risposta

0

È possibile importare tutte le librerie java direttamente nel codice scala.

Provate la sezione del tutorial scala: "interazione con Java".

Java in scala

0

Che tipo di funzionalità di scala si sta tentando di utilizzare con esso? Questo potrebbe aiutare a trovare una risposta. Cioè - che cosa stai cercando di fare con esso, potenzialmente in Java? Quindi possiamo provare a trovare un modo più carino per farlo con Scala e/o creare un wrapper per le classi che renderebbe ancora più facile ciò che stai cercando di fare.

+0

Abbastanza giusto. Ammetterò la mia domanda. –

+0

Grazie per le informazioni extra, ma intendevo ad un livello più tecnico - cioè, programmaticamente, cosa vuoi fare con la classe Swing? –

3

Si potrebbe considerare il meccanismo di "conversioni implicite" di Scala.Si potrebbe fare qualcosa di simile:

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

È ora definire una classe di RichJInternalFrame(), che prende un JInternalFrame, e ha tutto ciò che i metodi vuoi estendere JInternalFrame con, ad esempio:

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

Questo crea un nuovo metodo showQuesto che solo chiama show su JInternalFrame. Si potrebbe ora chiamare questo metodo su un JInternalFrame:

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

Scala convertirà automaticamente in un jif RichJInternalFrame e lasciare che si chiama questo metodo su di esso.

+1

Forse avrei dovuto essere più esplicito nella descrizione della mia domanda. Come dice la domanda stessa, voglio estendere lo scala.swing. Come posso estendere * scala.swing *? Una risposta che non menzioni nemmeno un singolo tratto, classe o metodo di scala.swing non può rispondere alla domanda! –

0

In JRuby, è possibile mescolare uno (o più) tratti in JDesktopPane o JInternalFrame invece di estenderli. In questo modo non avresti bisogno di avvolgere le classi, ma solo di usare gli oggetti esistenti. Per quanto ne so, questo non è possibile con i tratti Scala.

Fortunatamente, esiste una soluzione, quasi flessibile quanto quella di Ruby: lexically open classes. Questo articolo del blog offre un'ottima introduzione, IMHO.