2013-05-08 29 views
6

In genere, quando creo una classe, ad esempio Customer, gli do alcuni campi di dati, ad esempio public int IdNumber; e alcuni metodi, ad esempio public String getName(){...}. Ma questo è praticamente tutto. Non posso andare oltre e iniziare a giocare con la grafica: posso solo manipolare e organizzare i dati fino a che la classe lo consente.Come funziona JFrame? Nel profondo, come fa a disegnare cose?

Non riesco a capire cosa succede all'interno di JFrame. Chi ha scritto la classe JFrame, come hanno scritto una classe in grado di far apparire una scatola sullo schermo? Cosa sta succedendo internamente che lo fa accadere? C'è comunque da emularlo?

La stessa domanda si applica a tutte le classi Java basate su grafica. Sono davvero curioso di sapere come funziona, dato che mi infastidisce ogni volta che ne uso uno.

+1

Questa è forse pericolosamente vicino alla "Potrebbe scrivere un libro su in modo troppo ampio", ma sarei affascinato conoscere la risposta a prescindere –

+0

Credo che utilizza il sistema operativo sottostante per visualizzarli – Sam

+4

e non sei sorpreso su tutte le classi di networking, per esempio? È esattamente la stessa cosa La VM utilizza qualsiasi API nativa disponibile sulla piattaforma. – Mat

risposta

3

Java è iniziato con AWT (Abstract Windowing Toolkit) e successivamente introdotto altalena.

In AWT il ciclo di gestione eventi della piattaforma viene agganciato e gli eventi sono impacchettati nelle proprie classi java e una singola coda (non parallela) che gestisce la coda/thread li gestisce, uno dopo l'altro. Swing eredita questo.

In AWT Ogni componente della GUI, come il pulsante di opzione o la voce di menu, ha un controllo "peer" del codice nativo, il componente fornito dalla piattaforma. Esiste un insieme parallelo di classi java e la loro controparte C. Particolarmente interessante è la classe java Graphics che consente il disegno personalizzato di linee, rettangoli e simili. Viene visualizzato sotto Windows con un CDC (Device Context), presumibilmente.

In Swing la maggior parte dei componenti della piattaforma viene emulata, ovvero ricreata: il disegno, la gestione del mouse e così via. Quindi la parte nativa è più semplice, diciamo forse un CWnd (componente Window) con un disegno personalizzato.

L'oscillazione può ottenere una funzionalità più coerente e più ricca di funzionalità. È possibile immaginare che l'impostazione di un colore di sfondo su un pulsante di opzione AWT potrebbe non essere possibile oppure utilizzare l'HTML su un'etichetta o un suggerimento. Anche Swing può fare skinning, temi, LookAndFeels. Il sistema System ha un'impressione simile ai componenti della piattaforma. Particolarmente i componenti Swing sono più leggero, poiché non tutti i componenti hanno un controllo peer nativo da gestire in C.

Ora SWT è stata una successiva iniziativa di IBM realizzata in eclissi per AWT ricaricato. Non è personalizzabile come Swing ma è concepito per essere vicino alla piattaforma.

Si dovrebbe dimenticare di utilizzare i componenti AWT e, se non si esegue la programmazione per Eclipse RCP, anche SWT.

Quindi: eventi piattaforme globali come un clic del mouse, ridipingere richiesta sono tradotti agli eventi Java. Esiste una gerarchia di contenitori di JFrame, JPanels, JScrollPanes, JComponents. Un evento viene inviato ai componenti di gestione, su cui ad esempio paintComponent si chiama:

@Override 
public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; // A later introduced class that can do more. 
    g2.draw... 
} 

Con JavaFX arriva un nuovo giocatore, che è secondo me non è ancora completamente maturo, ma utilizzabile nel codice non di produzione. Abilita effetti/animazioni, rotazioni, trasformazioni, luce. Quindi un rendering 2D - 4D, basato sul rendering della piattaforma simile. Inoltre è basato sulla proprietà, quindi una casella di controllo non dovrebbe necessariamente essere associata a un valore booleano, ma a una proprietà booleana che osserva e notifica le modifiche. Mi serve ancora qualche esperienza pratica, per concepire un'architettura ottimale con esso.

3

Se sei curioso di sapere come implementare java, dovresti dare un'occhiata al codice sorgente. http://openjdk.java.net/projects/jdk7/ sarebbe un inizio.

Naturalmente questo vi darà solo un'idea di quella particolare implementazione e non significa che il vostro java sia implementato allo stesso modo.

+0

Non ho JFrame qui .... – CodyBugstein

+0

Non ho cercato dove lo si trova esattamente, ma http://openjdk.java.net/groups/swing/Swing e AWT è lì, e c'è anche una breve descrizione su di esso. – Devolus

2

Come appare una finestra su uno schermo? Questa funzionalità è offerta dal sistema operativo alla JVM (da X Window System su Linux).

A livello Java, JFrame eredita da java.awt.Window, che ha i "peer nativi" forniti dal nativo windowing system.

Se si vuole veramente capirlo, è meglio se si tenta di creare alcune finestre usando solo C.

+0

Dove posso trovare maggiori informazioni su quest'ultima parte? – CodyBugstein

+0

Questo è diverso su ogni sistema operativo. Su Linux "xlib" è la libreria più semplice (altre librerie sono costruite in cima a quella). Su Windows, la "API Win32" (o "API Win64") è la libreria di base. – lbalazscs

+0

Analogamente, OS X utilizza [Quartz] (https://en.wikipedia.org/wiki/Quartz_%28graphics_layer%29) – trashgod