Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45

    passaggio di variabili con un jframe

    Salve a tutti,
    premetto che mi sto avvicinando adesso all'uso dei jframe e quindi nn ho molta esperienza.
    Sto facendo tramite java il programma campo minato, ho creato la scacchiera tramite jframe a livello grafico e ora sto cercando di attuare la gestione. Per ora ho gestito tutto tramite JButton (quindi la scacchiera è composta da una serie di bottoni) e tramite il metodo actionPerformed faccio in modo che alla pressione di 1 casella della scacchiera, il suo contenuto venga modificato. Al momento i miei + grossi crucci sono 2.
    1) non so come fare a dire che la scacchiera deve essere inzializzata subito indipendentemente dai tasti premuti
    2) non so come far sì che la scacchiera sia creata in modo da essere vista da tutti (così che quando premo il tasto venga modificata)

    Al momento la grafica fa abbastanza schifo perchè mi sto occupando solo della gestione della scacchiera.
    Le dimensioni della scacchiera sono pure fissi, sempre perchè voglio occuparmene dopo.
    Per com'è ora actionPerformed la scacchiera viene creata ad ogni pressione (Cosa non bella... ).
    Allego il codice. Grazie a chi risponde. Accetto anche eventuali link a guide, visto che al momento non dispongo di materiale decente su jframe e l'università è chiusa.

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Vector;

    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;

    public class MineSweeperGraph extends JFrame implements ActionListener{

    private static final long serialVersionUID = 1L;
    int righeScacc = 3;
    int colScacc = 5;
    int dimCasella = 25; //25
    //int hCasella = 40;

    // ////////////////////////////////////////////////////
    // dichiarazione oggetti (pulsanti, label textfield,panel)
    // ////////////////////////////////////////////////////

    // button
    JButton button_restart = new JButton("Nuova Partita");
    JButton[][] button_scacchiera = new JButton[righeScacc][colScacc];


    public MineSweeperGraph(String titolo) { // viene visualizzato come titolo della
    // finestra

    super(titolo);// richiama il costruttore della superclasse Jframe
    // passando come parametro la stringa da visualizzare
    // sulla barra del titolo
    getContentPane().setLayout(null);


    //creo 1 bottone x casella


    for (int i = 0; i < righeScacc; i++){
    for(int j = 0; j < colScacc; j++){
    button_scacchiera[j] = new JButton("");

    }

    }

    // button_field.setBounds(119,26,100,38); //setto la dimensione
    button_restart.setBounds(10, 26, 120, 38); // setto la dimensione
    button_restart.addActionListener(this);//aggiungo il pulsante
    for (int i = 0; i < righeScacc; i++){
    for (int j = 0; j < colScacc; j++){
    button_scacchiera[j].setBounds(10 + (j*dimCasella) , 100 + (i*dimCasella), dimCasella, dimCasella);
    button_scacchiera[j].addActionListener(this);//aggiungo il pulsante
    }
    }

    // ////////////////////////////////////////////////////
    // metto quello che voglio sia disegnato nel jpanel
    // ///////////////////////////////////////////////////

    getContentPane().add(button_restart);
    for (int i = 0; i < righeScacc; i++){
    for (int j = 0; j < colScacc; j++){
    getContentPane().add(button_scacchiera[j]);
    //System.out.print( i + "," + j + " ");
    }
    //System.out.println("");
    }

    setResizable(false);
    setBounds(100, 100, 800, 650);
    setVisible(true); // x rendere visibile il frame(di default non lo è)
    }
    public void actionPerformed( ActionEvent e){ //nella ver originale usato come tipo boolean
    int num;
    int xMax = 3;
    int yMax = 5;
    Object target = e.getSource();

    StatoCorrente statoCorrente = new StatoCorrente(xMax,yMax);
    if (target == button_restart){
    statoCorrente= new StatoCorrente(xMax,yMax);

    }
    /*
    *quando l'utente preme la casella di coordinate [x][y]
    *deve partire gestisciUtente
    */

    for (int x = 0; x < xMax; x++){
    for (int y = 0; y < yMax; y++){
    if (target == button_scacchiera[x][y]){
    statoCorrente.gestisciInputUtente(x,y, xMax, yMax);
    statoCorrente.stampaScacchieraUtente(x,y,xMax, yMax);
    }
    }

    }


    }
    public static void main( String [] args ){

    new MineSweeperGraph( "Campo minato" ).setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    }

  2. #2
    Non ho capito con chiarezza di cosa hai bisogno, cmq nel codice ci sono un po' di errori per quanto riguarda gli indici dell'array bidimensionale, a te compila?? Un suggerimento intanto puo' essere quello di fare un cast a "targer" per farlo tornare un pulsante (fintanto che non ci sono altri elementi a costituire l'interfaccia):

    Codice PHP:
    JButton target = (JButtone.getSource(); 
    in tal modo puoi direttamente lavorare sul bottone, tipo per fare un esempio all'interno dell'action listener:

    Codice PHP:
    if (target == button_restart){
      }
    else {
        
    target.setEnabled(false);
        
    //ed il resto dei cambiamenti che devo succedere

    per il resto veramente non ho capito cos'hai chiesto

  3. #3
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537
    Non ho capito...
    Tu crei ogni volta una scacchiera nuova?
    Ma scusa, prova ad optare per questa opzione ,ovvero la tua scacchiera la mappi su una matrice, poi a seconda del bottone premuto, mostri una JLabel, anzichè un JButton ( o Label o Button ), in modo da non dover creare ogni volta la finestra...
    Poi mi aggiungo a pinzo, non è stato chiaro quello che vuoi...
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Scusate se sono stato poco chiaro. Innanzitutto non mi ero accorto che il copia incolla aveva modificato alcune righe (in particolare quelle dell'uso dell'array bidimensionale), non chiedetemi perchè; cmq riallego il codice. In ogni caso compilando funziona, con i problemi di cui ho parlato prima.


    Codice PHP:
    public class MineSweeperGraph extends JFrame implements ActionListener{
        
        private static final 
    long serialVersionUID 1L;
        
    int righeScacc 3;
        
    int colScacc 5;
        
    int dimCasella 25


        
    // ////////////////////////////////////////////////////
        // dichiarazione oggetti (pulsanti, label textfield,panel)
        // ////////////////////////////////////////////////////

        // button
        
    JButton button_restart = new JButton("Nuova Partita");
        
    JButton[][] button_scacchiera = new JButton[righeScacc][colScacc];
        
        
        public 
    MineSweeperGraph(String titolo) { // viene visualizzato come titolo della
                                            // finestra
            
            
    super(titolo);// richiama il costruttore della superclasse Jframe
                            // passando come parametro la stringa da visualizzare
                            // sulla barra del titolo
            
    getContentPane().setLayout(null);
            

            
    //creo 1 bottone x casella
            
            
            
    for (int i 0righeScacci++){
                for(
    int j 0colScaccj++){
                    
    button_scacchiera[i][j] = new JButton("");
                    
                }            
                
            }
            
            
    // button_field.setBounds(119,26,100,38); //setto la dimensione
            
    button_restart.setBounds(102612038); // setto la dimensione
            
    button_restart.addActionListener(this);//aggiungo il pulsante
            
    for (int i 0righeScacci++){
                for (
    int j 0colScaccj++){
                    
    button_scacchiera[i][j].setBounds(10 + (j*dimCasella) , 100 + (i*dimCasella), dimCaselladimCasella);
                    
    button_scacchiera[i][j].addActionListener(this);//aggiungo il pulsante 
                    
    }              
              }                    

            
    // ////////////////////////////////////////////////////
            // metto quello che voglio sia disegnato nel jpanel
            // ///////////////////////////////////////////////////

            
    getContentPane().add(button_restart);
            for (
    int i 0righeScacci++){
                for (
    int j 0colScaccj++){
                    
    getContentPane().add(button_scacchiera[i][j]);
                }
            }
            
            
    setResizable(false);
            
    setBounds(100100800650);
            
    setVisible(true); // x rendere visibile il frame(di default non lo è)
        
    }
        public 
    void actionPerformedActionEvent e){ 

            
    int num;
            
    int xMax 3;
            
    int yMax 5;
            
    Object target e.getSource();
            
            
    //creazione della scacchiera(messa così crea e riempie 1 scacchiera ogni volta
            //che viene premuto un tasto e quindi non va bene (mi servirebbe ne crei 1 all'inizio
            //e mantenga quella per tutta la partita

            
    StatoCorrente statoCorrente = new StatoCorrente(xMax,yMax);
            if (
    target == button_restart){
                
    //se viene premuto il pulsante "nuova partita", viene creata la scacchiera
                
    statoCorrente= new StatoCorrente(xMax,yMax);
                
    System.out.println("\n\nstampa della scacchiera completa");        
                
    statoCorrente.stampaScacchiera(xMaxyMax);
            }
            
    /*
             *quando l'utente preme la casella di coordinate [x][y]
             *deve partire gestisciUtente, che valuta se la casella cliccata è una mina o meno.
             *decide se la partita può proseguire e segna come visitata la casella   
             */
            
            
    for (int x 0xMaxx++){
                for (
    int y 0yMaxy++){
                    if (
    target == button_scacchiera[x][y]){
                        
    statoCorrente.gestisciInputUtente(x,yxMaxyMax);
                        
    statoCorrente.stampaScacchieraUtente(x,y,xMaxyMax);
                    }
                }
            }
          
        
        }
        public static 
    void mainString [] args ){
            
            new 
    MineSweeperGraph"Campo minato" ).setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }


    Per quanto riguarda quel che mi serve, diciamo che il programma in sostanza è il gioco campo minato di windows. A livello grafico il programma crea una scacchiera grande 5 x 3 fatta di pulsanti (sarebbe il classico rettangolo di campo minato).
    Ho creato il metodo per creare la scacchiera a livello di contenuto(quindi decidere dove sono le mine e indicare in ogni altra casella quante mine ha intorno), ma non so come far sì che, nel momento in cui viene disegnata la scacchiera, venga subito creato anche il contenuto della scacchiera e non solo il disegno. Per ora tale creazione avviene ad ogni pressione di un pulsante, cosa che non va assolutamente bene: dovrebbe essere creata solo una volta all'inizio e poi ogni volta che si preme il button_restart.
    La scacchiera è 1 oggetto creato così:
    Codice PHP:
    StatoCorrente statoCorrente = new StatoCorrente(xMax,yMax); 
    Dove xMax e yMax sono le due dimensioni della scacchiera.
    Non ho riportato la classe StatoCorrente perchè funziona e non devo modificarla. Vi basti sapere che crea e gestisce la scacchiera a livello di contenuto.
    Mi fermerei al primo problema visto che sto mi sto già dilungando. Non so se sono stato più chiaro adesso.
    Comunque se mi sapete dare il link di un buon tutorial sull'uso dei jFrame apprezzo, visto che mi rendo conto che andare troppo a tentoni rischia di essere poco produttivo...
    Grazie a chi risponde, spero di essere stato un po' più chiaro.

  5. #5
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537
    Ho preso in mano il codice, e ci sono alcuni errori:
    codice:
    for (int i = 0; i < righeScacc; i++){
    	for(int j = 0; j < colScacc; j++){
    		button_scacchiera[j] = new JButton("");
    	}
    }
    

    Dimenticato indice i


    codice:
    for (int i = 0; i < righeScacc; i++){
    	for (int j = 0; j < colScacc; j++){
    		button_scacchiera[i][j].setBounds(10 + (j*dimCasella) , 100 + (i*dimCasella), dimCasella, dimCasella);
    		button_scacchiera[j].addActionListener(this);//aggiungo il pulsante
    	}
    }
    

    Dimenticato indice i


    codice:
    for (int i = 0; i < righeScacc; i++){
    	for (int j = 0; j < colScacc; j++){
    		getContentPane().add(button_scacchiera[i][j]);
    //System.out.print( i + "," + j + " ");
    	}
    //System.out.println("");
    }
    Ancora....


    Per il resto non posso testare il codice in quanto non sono in possesso della classe StatoCorrente ( anche se immagino cosa faccia ).
    Fammi sapere per le domande che ti ho fatto prima...
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  6. #6
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537
    Vai sul sito della Sun, sono in inglese e sono ottimi Tutorial.
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Per quanto riguarda gli errori, hai ragione ma sono dovuti a degli inspiegabili copia incolla (l'ultimo incollato mi sembra non li abbia più cmq).
    Per quanto concerne il resto del codice, non so come allegarlo: se lo incollo qui mi dice che è troppo lungo e come file non posso allegarlo in quanto non è una delle estensioni valide... Non c'è un modo accettato dal forum per farlo? Potrei anche spezzarlo in più post ma non credo possa essere gradito...
    Per il tutorial, appena ho un attimo do 1 occhiata, grazie.

  8. #8
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537
    Niente....fai così, controlla il tutorial appena puoi e se hai ancora dubbi posta.
    Mettere per intero il codice è meglio che sia l'ultima soluzione possibile.
    Buono studio!
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.