|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2003
Città: Modena
Messaggi: 149
|
[JAVA] alcune domanda sulla Grafica/swing
Ciao a tutti,
quello che voglio iniziare a progettare è un programma tipo freevo , 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 ? |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
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. |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Mar 2004
Messaggi: 7
|
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... |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
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 Codice:
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();
}
}
}
}
Codice:
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 Codice:
public class MainClass {
public static void main(String[] args) {
new Engine2D().start();
}
}
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. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Nov 2003
Città: Modena
Messaggi: 149
|
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 ? |
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
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
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()) |
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Nov 2003
Città: Modena
Messaggi: 149
|
Quote:
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 ? |
|
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Quote:
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". |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Nov 2003
Città: Modena
Messaggi: 149
|
mmmm ok, è meglio se prima mi leggo qualcosa di swing visto ke non ci stò più capendo niente
qulache link a qualche buon tutorial ? mi interesse molto il fatto di crearsi dei componenti a doc, esiste qualke buon esempio/ tutorial ? thanks. |
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Introduzione a swing
http://java.sun.com/docs/books/tutor...ing/index.html Il malloppone: http://java.sun.com/products/jlf/ed1/dg/index.htm |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:59.



















