|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Sep 2004
Città: Sardegna
Messaggi: 98
|
[JAVA]Problema eventi finestra e bottoni
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? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
emh, il codice???
![]() ![]()
__________________
My gaming placement |
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Sep 2004
Città: Sardegna
Messaggi: 98
|
Quote:
Classe Della finestra principale: Codice:
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"); } } } } Codice:
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); } } } } |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
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". ![]() ![]() ![]()
__________________
My gaming placement |
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Sep 2004
Città: Sardegna
Messaggi: 98
|
Quote:
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! ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:59.