PDA

View Full Version : [JAVA] alcune domanda sulla Grafica/swing


cavva81
07-03-2004, 18:45
Ciao a tutti,

quello che voglio iniziare a progettare è un programma tipo freevo (http://freevo.sourceforge.net/) , chiaamente con funzionalità un pò diverse.

quindi, per partire , volevo sapere:

- in java è possibile aprire i programmi in "full-screen" ? senza cioè presentare i classici bottoni tipo chidi, iconizza, ecc...

- riesco a mettere come sfondo della finestra un qualcosa tipo un'immagine o, meglio ancora, un filmato ?

PGI
07-03-2004, 19:14
Si&Si, a patto di usare una versione recente (1.4.0 o superiore).

Appena lo trovo ti passo il link al tutorial di Sun sull'argomento.

Ciao.

srcProgram
07-03-2004, 21:00
Salve...

se utilizzi i Frame o JFrame come finestre su cui lavorare... puoi avvalerti del metodo setUndecorated...
" setUndecorated(true); " passando true a questo metodo, la tua finestra si presentera' senza i classici bottoni chiudi, riduci a icona...

PGI
07-03-2004, 22:03
srcProgram ha pienamente ragione, però qui la faccenda è uno zinzinello più complicata.

Noi lasciamo che parli il codice, poi se c'è qualcosa da spiegare, siamo qui per quello.

FullScreenBuffer


import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class FullScreenBuffer {
GraphicsDevice device =
GraphicsEnvironment.
getLocalGraphicsEnvironment().
getDefaultScreenDevice();

public void enterFullScreen(DisplayMode displayMode, JFrame window) {
window.setUndecorated(true);
window.setResizable(false);
/* ignora lengthrichieste di aggiornamento*/
/* che provengono dal sistema operativo */
window.setIgnoreRepaint(true);
/* modalità fullscreen o mimic-fullscreen*/
device.setFullScreenWindow(window);
if(displayMode != null && device.isDisplayChangeSupported()) {
device.setDisplayMode(displayMode);
}
}

public void exitFullScreen() {
Window window = device.getFullScreenWindow();
if(window != null) {
window.dispose();
}
device.setFullScreenWindow(null);
}

public Graphics2D getGraphics() {
Window window = device.getFullScreenWindow();
if(window != null) {
return (Graphics2D)window.getBufferStrategy().getDrawGraphics();
}
return null;
}

public void update() {
Window window = device.getFullScreenWindow();
if(window != null) {
BufferStrategy strategy = window.getBufferStrategy();
if(strategy.contentsLost() == false) {
strategy.show();
}
}
}
}


Engine2D


import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;

public class Engine2D implements Runnable {
boolean loop = false;
FullScreenBuffer fscreen = new FullScreenBuffer();
DisplayMode displayMode = new DisplayMode(1024, 768, 32, 85);
Image image = null;
Thread runner = null;

/** Creates a new instance of Engine2D */
public Engine2D() {
try {
image = ImageIO.read(new File("z:\\immagine.png"));
} catch(IOException e) {
e.printStackTrace(System.err);
System.exit(0);
}
}

public void start() {
if(loop == false) {
fscreen.enterFullScreen(displayMode, new javax.swing.JFrame());
Toolkit.getDefaultToolkit().getSystemEventQueue().push(new KeyQueue());
if(runner == null) {
runner = new Thread(this);
}
loop = true;
runner.start();
}
}

public void stop() {
loop = false;
fscreen.exitFullScreen();
System.exit(0);
}

public void run() {
while(loop) {
Graphics2D graphics = fscreen.getGraphics();

graphics.drawImage(image, 0, 0, null);

graphics.dispose();

fscreen.update();
}

}


class KeyQueue extends EventQueue {
protected void dispatchEvent(AWTEvent e) {
if(e instanceof KeyEvent) {
KeyEvent ke = (KeyEvent)e;

int keyCode = ke.getKeyCode();

if(keyCode == KeyEvent.VK_ESCAPE) {
stop();
}
} else {
super.dispatchEvent(e);
}
}
}

}



MainClass


public class MainClass {
public static void main(String[] args) {
new Engine2D().start();
}
}


FullScreenBuffer si occupa di gestire la finestra "schermo intero". In questo caso si tratta di una finestra per active-rendering (con doppio buffer e page-flipping).

Una volta che hai l'oggetto Graphics2D su cui disegnare, il resto diventa una questione di fantasia (e un bel po' di tempo).

Engine2D è poco più di un loop che aggiorna lo schermo.

La pressione del tasto "esc" termina il ciclo del mini-motore di rendering. In questo caso ho inserito nella coda di gestione degli eventi AWT un'estensione di EventQueue che garantisce l'uscita alla pressione del tast esc qualunque sia il componente in cui il tasto viene premuto (una mera questione di sicurezza, poi sceglierai tu come terminare la sessione full-screen).

Il tutto richiede l'uso di un JDK 1.4.2.

Ciao.

cavva81
08-03-2004, 00:37
grazie ragazzi, e complimenti a PGI per il codice ke appena posso lo provo :) .

io però con swing e soci in java stò proprio a zero, quindi prima di immergermi negli how-to chiedo a voi, se invece di un'immagine ci volessi un filmatino (da metterre in ricorsione) come sfondo... sarebbe complicato ? altra cosa, quando vado a posizionare i vari componenti Swing ci sono cose particolari a cui devo prestare attenzione ?

PGI
08-03-2004, 11:47
Se vuoi maneggiare filmati c'è l'API JMF (trovi il pacchetto sul sito sun). In estrema sintesi, nell'API trovi un componente AWT(Player.getqualcosa, tanto per essere precisi :D) già bell'e pronto per visualizzare filmati. Tutto quello che devi fare è inserirlo nel layout della finestra e dargli in pasto un filmato.

Se intendi usare i componenti Swing (bottoni, pannelli etichette ecc.) il ciclo di Engine2D non va bene (anzi, tutta la classe Engine2D può andare al macero).

Quello che dovresti fare è costruire la finestra (JFrame) usando il normale procedimento dell'AWT Java (jframe.getContentPane().blabla ...) e poi far masticare la finestra a FullScreenBuffer, che la proietta sullo schermo in modalità full-screen.

Ricorda che se elimini Engine2D devi trovare un procedimento alternativo per uscire dalla modalità full-screen (ma è sufficiente un bottone con su scritto "esc" da qualche parte, a cui associ una chiamata a fullscreenbuffer.exitFullScreen())

cavva81
08-03-2004, 13:57
Se intendi usare i componenti Swing (bottoni, pannelli etichette ecc.) il ciclo di Engine2D non va bene (anzi, tutta la classe Engine2D può andare al macero).



ecco, questo è quello ke temevo...
quindi se voglio utilizzare i componenti Swing non riesco ad avere uno sfondo con un'immagine o un filmato, giusto ?
ma riesco ad evitare l'utilizzo dei componenti swing? io devo avere un'iterazione con l'utente, come posso non utilizzare i componenti swing o AWT ?

PGI
08-03-2004, 14:14
Originariamente inviato da cavva81
ecco, questo è quello ke temevo...
quindi se voglio utilizzare i componenti Swing non riesco ad avere uno sfondo con un'immagine o un filmato, giusto ?
ma riesco ad evitare l'utilizzo dei componenti swing? io devo avere un'iterazione con l'utente, come posso non utilizzare i componenti swing o AWT ?

Se usi i componenti Swing puoi avere sullo sfondo anche mio nonno che fa ciao con la manina, solo che ottieni la cosa in modo diverso (e a dire il vero anche più semplice) rispetto alla costruzione di un'interfaccia a partire da immagini "raw".

L'interazione con l'utente si ottiene anche senza componenti precotti.

Un pulsante è un'immagine localizzata sullo schermo, è sufficiente ottenere le cordinate del mouse per poter costruire una reazione dell'interfaccia. In pratica tratti lo schermo come se fosse una grossa mappa interattiva e nel ciclo di rendering usi un albero che contiene le informazioni relative a ciascun componente attivo sullo schermo, ad ogni passata "pitturi" ogni singolo componente usando le sue informazioni di stato (se è premuto, un pulsante sarà rappresentato dall'immagine B anzichè A, il componente video mostra il frame corrente del flusso video e via dicendo).

E' il classico lavoro certosino, ma potrebbe essere "divertente".

cavva81
09-03-2004, 08:13
mmmm ok, è meglio se prima mi leggo qualcosa di swing visto ke non ci stò più capendo niente :muro:

qulache link a qualche buon tutorial ? mi interesse molto il fatto di crearsi dei componenti a doc, esiste qualke buon esempio/ tutorial ?

thanks.

PGI
09-03-2004, 13:23
Introduzione a swing

http://java.sun.com/docs/books/tutorial/uiswing/index.html

Il malloppone:

http://java.sun.com/products/jlf/ed1/dg/index.htm