Ecco, ho corretto il codice:
codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
/*
* Questa classe genera una finestra con un immagine di sfondo.
*/
public class GUI extends Window {
private JRadioButton closeButton;
private JButton start;
/* 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);
//Crea un'istanza della classe interna Gestore per la gestione dell'uscita dal gioco
Gestore gestore = new Gestore();
closeButton.addActionListener(gestore);
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);
start.addActionListener(gestore);
layer.add(start, 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();
}
}
}
}
Si, era proprio un problema di scope dei dati, non avevo dichiarato esternamente i pulsanti closeButton e start, per cui non riusciva a riconoscerli all'interno dei metodi e tantomeno ad assegnargli eventi.
Grazie per l'aiuto, a buon rendere!
carlo