PDA

View Full Version : [JAVA]Problema eventi finestra e bottoni


caralu
16-05-2006, 19:49
Ciao! Mi serve un'aiuto!!
Ho corretto tutto e adesso mi funziona QUASI perfettamente la gestione dei bottoni, a parte che ne dovrei creare altri due che implementano dei listeners che generano certi eventi (al click di uno qualsiasi di questi 2 bottoni si dovrebbe chiudere la finestra principale e se ne dovrebbe aprire un'altra della stessa dimensione, sullo stesso punto di quella principale. Chidendo poi quest'ultima finestra creata si dovrebbe riaprire la finestra principale).
Ho provato a implementare tutto ciò sfruttando un po di codice della finestra principale (il codice che ho postato sopra), ma non riesco a chiudere la principale e fare aprire la nuova. Potete darmi qualche consiglio?

franksisca
16-05-2006, 20:58
emh, il codice??? :p :p

caralu
16-05-2006, 21:28
emh, il codice??? :p :p
Scusa.....
Classe Della finestra principale:

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

public class GUI extends Window {
private JRadioButton closeButton;
private JButton start;
private JButton configura;
private JButton credit;
private JButton help;
private JLabel authors;

/* Larghezza della finestra (della foto di sfondo)*/
public static final int WIDTH = 629;

/* Altezza della finestra (della foto di sfondo)*/
public static final int HEIGHT = 475;

/* Frame associato alla finestra */
protected static JFrame frameOwner = new JFrame("Carlo e Marco");

/* Ascoltatore per i movimenti del mouse */
private static MouseMotion mouseMotion;

/* Verifica della mobilità della finestra */
private static boolean moveable = true;

/* Istanza di questa classe */
public static GUI menù;

/*Dimensioni icone pulsante menù*/
private static final int ALTEZZA_PULSANTE = 35;
private static final int LARGHEZZA_PULSANTE = 150;

/*posizione icone pulsanti menù*/
private int yPulsante = 160;
private final int X_PULSANTE = 40;
private final int DISTANZA_PULSANTE = 10;
/*
* Punto di accesso del programma, da qua avviamo l'interfaccia grafica.
*/
public static void main(String argv[]) {
GUI gui = new GUI();
}

/*
* Costruttore Standard (contiene tutte le istruzioni per creare i componenti grafici).
*/
public GUI() {

super(frameOwner);

//Diamo una dimensione alla nostra finestra e posizioniamola al centro dello schermo:
//WIDTH ed HEIGHT sono due costanti che definiscono larghezza e altezza
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-WIDTH)/2,(screenSize.height-HEIGHT)/2,WIDTH,HEIGHT);

ImageIcon icon = new ImageIcon("background.png"); //Carichiamo la nostra immagine di sfondo
JLabel background = new JLabel(icon);
background.setSize(background.getPreferredSize());

/* Inseriamo la nostra immagine come se fosse uno sfondo; gli elementi aggiunti manm mano vengono collocati uno sopra l'altro.
L'immagine è visualizzata tramite un semplice componente JLabel aggiunto poi al JLayeredPane, unico pannello che risiede nella
window */
JLayeredPane layer = new JLayeredPane();
layer.setPreferredSize(background.getPreferredSize());
layer.add(background, JLayeredPane.DEFAULT_LAYER);

setLayout(new BorderLayout());
add("Center", layer);

JLabel title = new JLabel("PROVA A USCIRE DAL LABIRINTO!",new ImageIcon("icon.png"),SwingConstants.LEFT);
title.setBounds(30,10,400,64);
title.setFont(new Font(title.getFont().getName(),Font.BOLD,20));
//Ogni altro elemento grafico deve essere aggiunto alla finestra non passando per il metodo add(), bensì per il layer seguente:
layer.add(title, JLayeredPane.PALETTE_LAYER);

//Pulsante di chiusura: collocazione sul pannello e attribuzione del compito di chiusura della finestra.
closeButton = new JRadioButton(new ImageIcon("close.png"));
closeButton.setBounds(570,18,40,37);
closeButton.setFocusable(false);
closeButton.setBorderPainted(true);
closeButton.setOpaque(false);

layer.add(closeButton, JLayeredPane.PALETTE_LAYER);

start = new JButton(new ImageIcon("start.jpg"));
start.setBounds(X_PULSANTE,yPulsante,LARGHEZZA_PULSANTE,ALTEZZA_PULSANTE);
start.setFocusable(false);
start.setBorderPainted(true);
start.setOpaque(false);
layer.add(start, JLayeredPane.PALETTE_LAYER);

configura = new JButton(new ImageIcon("opzioni.jpg"));
configura.setBounds(X_PULSANTE, (yPulsante += (DISTANZA_PULSANTE + ALTEZZA_PULSANTE)), LARGHEZZA_PULSANTE, ALTEZZA_PULSANTE);
configura.setFocusable(false);
configura.setBorderPainted(true);
configura.setOpaque(false);
layer.add(configura, JLayeredPane.PALETTE_LAYER);

credit = new JButton(new ImageIcon("credits.jpg"));
credit.setBounds(X_PULSANTE,(yPulsante += (DISTANZA_PULSANTE + ALTEZZA_PULSANTE)), LARGHEZZA_PULSANTE, ALTEZZA_PULSANTE);
credit.setFocusable(false);
credit.setBorderPainted(true);
credit.setOpaque(false);
layer.add(credit, JLayeredPane.PALETTE_LAYER);

help = new JButton(new ImageIcon("help.jpg"));
help.setBounds(X_PULSANTE,(yPulsante += (DISTANZA_PULSANTE + ALTEZZA_PULSANTE)), LARGHEZZA_PULSANTE, ALTEZZA_PULSANTE);
help.setFocusable(false);
help.setBorderPainted(true);
help.setOpaque(false);
layer.add(help, JLayeredPane.PALETTE_LAYER);

//Aggiungiamo un'ascoltatore degli eventi per ogni bottone
Gestore gestore = new Gestore(); //Crea un'istanza della classe interna Gestore per la gestione dell'uscita dal gioco
closeButton.addActionListener(gestore);
start.addActionListener(gestore);
configura.addActionListener(gestore);
credit.addActionListener(gestore);
help.addActionListener(gestore);

authors = new JLabel("<HTML><BODY>\t gioco</BODY></HTML>");
authors.setBounds(452,427,400,30);
layer.add(authors, JLayeredPane.PALETTE_LAYER);

mouseMotion = new MouseMotion();
addMouseMotionListener(mouseMotion);
addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
if (!moveable) return;
mouseMotion.clearPosition();
}
public void mousePressed(MouseEvent me)
if (!moveable) return;
});

setVisible(true);
}


/*
* Ascoltatore per rilevare i movimenti del mouse e consentire
* lo spostamento esatto della finestra (gestisce il trascinamento col mouse).
*/
public class MouseMotion implements MouseMotionListener {

int oldx = -10;
int oldy = -10;

public void mouseDragged(MouseEvent me) {

if (!moveable) return;

if ((oldx == -10) && (oldy == -10)) {
oldx = me.getX();
oldy = me.getY();
return;
}

if (me.getID() == MouseEvent.MOUSE_RELEASED) {
System.out.println("x: " + me.getX() + " y: " + me.getY());
}

setLocation(getLocation().x - (oldx - me.getX()), getLocation().y - (oldy - me.getY()));

}

public void mouseMoved(MouseEvent me) {}

public void clearPosition() {
oldx = -10;
oldy = -10;
}
}

/*Classe interna per la gestione dell'uscita dal gioco*/
private class Gestore implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Object src = e.getSource();

if ( src.equals(closeButton) )
{
//n è il valore di ritorno del pulsante che viene premuto nella finestra di dialogo: 0 = "SI", 1 = "NO"
int n= JOptionPane.showConfirmDialog(null,"Sei sicuro di volere uscire dal gioco?", "EXIT", JOptionPane.YES_NO_OPTION);
if(n==0)
System.exit(0);
}
else
if( src.equals(start) )
{
frameOwner.setVisible(false);
Game inizio = new Game();
}
else
if( src.equals(configura) )
{
frameOwner.setVisible(false);
Configure nuoveOpzioni = new Configure();
}
else
if( src.equals(credit) )
{
System.out.println("credit");
}
else
if( src.equals(help) )
{
System.out.println("help");
}

}
}
}

Classe della finestra che mi dovrebbe aprire:

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

public class Configure extends GUI
{
private JButton closeButton;
/* Frame associato alla finestra */
protected static JFrame frameConfigure = new JFrame("Configure");

/* Ascoltatore per i movimenti del mouse */
private static MouseMotion mouseMotion;

/* Verifica della mobilità della finestra */
private static boolean moveable = true;

/*Dimensioni icone pulsante menù*/
private static final int ALTEZZA_PULSANTE = 35;
private static final int LARGHEZZA_PULSANTE = 150;

/*posizione icone pulsanti menù*/
private int yPulsante = 160;
private final int X_PULSANTE = 40;
private final int DISTANZA_PULSANTE = 10;
/*
* Punto di accesso del programma, da qua avviamo l'interfaccia grafica.
*/
public static void main(String argv[]) {
Configure nuovaConfigurazione = new Configure();
}

/*
* Costruttore Standard (contiene tutte le istruzioni per creare i componenti grafici).
*/
public Configure()
{

//super(frameConfigure);

//Diamo una dimensione alla nostra finestra e posizioniamola al centro dello schermo:
//WIDTH ed HEIGHT sono due costanti che definiscono larghezza e altezza
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-WIDTH)/2,(screenSize.height-HEIGHT)/2,WIDTH,HEIGHT);

ImageIcon icon = new ImageIcon("settings.jpg"); //Carichiamo la nostra immagine di sfondo
JLabel background = new JLabel(icon);
background.setSize(background.getPreferredSize());

/* Inseriamo la nostra immagine come se fosse uno sfondo; gli elementi aggiunti manm mano vengono collocati uno sopra l'altro.
L'immagine è visualizzata tramite un semplice componente JLabel aggiunto poi al JLayeredPane, unico pannello che risiede nella
window */
JLayeredPane layer = new JLayeredPane();
layer.setPreferredSize(background.getPreferredSize());
layer.add(background, JLayeredPane.DEFAULT_LAYER);

setLayout(new BorderLayout());
add("Center", layer);

JLabel title = new JLabel("CONFIGURAZIONE I COMANDI",new ImageIcon("icona_chiave.jpg"),SwingConstants.LEFT);
title.setBounds(30,10,400,64);
title.setFont(new Font(title.getFont().getName(),Font.BOLD,20));
//Ogni altro elemento grafico deve essere aggiunto alla finestra non passando per il metodo add(), bensì per il layer seguente:
layer.add(title, JLayeredPane.PALETTE_LAYER);

//Pulsante di chiusura: collocazione sul pannello e attribuzione del compito di chiusura della finestra.
closeButton = new JButton(new ImageIcon("close.png"));
closeButton.setBounds(570,18,40,37);
closeButton.setFocusable(false);
closeButton.setBorderPainted(true);
closeButton.setOpaque(false);

layer.add(closeButton, JLayeredPane.PALETTE_LAYER);

//Aggiungiamo un'ascoltatore degli eventi per ogni bottone
Gestore gestore = new Gestore(); //Crea un'istanza della classe interna Gestore per la gestione dell'uscita dal gioco
closeButton.addActionListener(gestore);

mouseMotion = new MouseMotion();
addMouseMotionListener(mouseMotion);

addMouseListener(new MouseAdapter()
{
public void mouseReleased(MouseEvent me)
{
if (!moveable) return;
mouseMotion.clearPosition();

}
public void mousePressed(MouseEvent me)
{
if (!moveable) return;

}
});

setVisible(true);


}


/*
* Ascoltatore per rilevare i movimenti del mouse e consentire
* lo spostamento esatto della finestra (gestisce il trascinamento col mouse).
*/
public class MouseMotion implements MouseMotionListener
{

int oldx = -10;
int oldy = -10;

public void mouseDragged(MouseEvent me) {

if (!moveable) return;

if ((oldx == -10) && (oldy == -10))
{
oldx = me.getX();
oldy = me.getY();
return;
}

if (me.getID() == MouseEvent.MOUSE_RELEASED)
{
System.out.println("x: " + me.getX() + " y: " + me.getY());
}

setLocation(getLocation().x - (oldx - me.getX()), getLocation().y - (oldy - me.getY()));

}

public void mouseMoved(MouseEvent me) {}

public void clearPosition()
{
oldx = -10;
oldy = -10;
}
}

/*Classe interna per la gestione dell'uscita dal gioco*/
private class Gestore implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Object src = e.getSource();

if ( src.equals(closeButton) )
{
frameConfigure.setVisible(false);
GUI menùInizio = new GUI();
menùInizio.frameOwner.setVisible(true);
}

}
}
}

franksisca
16-05-2006, 22:52
io ti consiglio smplicemente di provare a fare così, scusa se sarò poco chiarmo ma sto uscendo:

crea un metodo che apre la nuova finestra, e prima del metodo setti il frame a visible=false, e dopo la chiamata al metodo, che ritornerà solo quando la finestra sarà chiusa metti visible=true.

Prova, dovrebbe funzionare, altrimenti domani dò una occhiata "migliore". :D :D :D

caralu
17-05-2006, 11:04
io ti consiglio smplicemente di provare a fare così, scusa se sarò poco chiarmo ma sto uscendo:

crea un metodo che apre la nuova finestra, e prima del metodo setti il frame a visible=false, e dopo la chiamata al metodo, che ritornerà solo quando la finestra sarà chiusa metti visible=true.

Prova, dovrebbe funzionare, altrimenti domani dò una occhiata "migliore". :D :D :D
Grazie!
Ho provato a fare quello che mi hai consigliato, ma con il codice che ho postato mi apre un nuovo frame (diverso dalla finestra che voglio creare).
Il mio obiettivo è che compaia al momento del click (su un bottone della finestra principale) una finestra delle stesse dimensioni e sullo stesso posto di quella principale...Per fare ciò stavo utilizzando il codice della finestra principale, ma senza esito! :help: