Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23

Discussione: Array di jButton

  1. #1

    Help! array di jButton

    Salve a tutti, sono nuovo del forum. Mi sto cimentando con java per un esame di informatica grafica. Devo programmare il gioco salta casella (o gioco del 100), questo è il link ke spiega il gioco (tranquilli nn è spam! ) http://www.carlogirelli.com/giochi/100/100.html

    Vi spiego cosa ho fatto fino ad ora e qual'è il problema.
    Ho esteso un jPanel nel quale da interfaccia scelgo quanto deve essere grande la mia matrice di Jbutton (NxN, min 5x5 max 10x10), cioè la mia pulsantiera di caselle per il gioco (l'ho creata con un array di array "JButton[i][j] b"). Questa pulsantiera compare quando clicco sul pulsante della GUI "gioca" e parte anche un cronometro. Fino a qui tutto ok.
    Il problema è il seguente: cliccando su un pulsante a scelta dovo far comparire su esso il numero 1, poi sul secondo che clicco il 2...e così via. Per farlo ho creato un altro array questa volta di numeri interi grande quanto l'array della matrice di pulsanti (es: se la matrice è 10x10, l'array di numeri è 100).
    Il problema è che nn riesco ad assegnare al corrente bottone che clicco il corrente numero progressivo! Cioè i numeri me li incrementa quando clicco, ma sempre sullo stesso bottone(tra l'altro il primo della matrice), qualunque button io clicchi all'interno della matrice.
    Pensavo che per risolvere il problema avrei potuto usare un metodo che mi restituisse i valori i e j dell'ultimo bottone cliccato, in modo da dirgli che su QUELL BOTTONE doveva mettere QUEL NUMERO.... ESISTE UN METODO CHE PUO' FARE CIO'???

    Scusate se ho detto delle stupidagini, magari la soluzione è semplice, sn alle primissime armi e conosco pochi metodi (malgrado per questo problema abbia ricercato a lungo e provato diverse cose - senza risultato ovvio!).

    Di seguito tutto il codice:

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

    public class SaltaCasella extends JPanel {

    private Rectangle2D.Double rettangolo;
    private JButton[][] b;
    private int numBottoni[];
    int i;
    int j;
    int p;
    int mm;
    private JButton gioca, reset;
    private JTextField matrice, cronometro;
    private int N = 0;
    Timer timer;
    private int secondi=0;
    private int minuti=0;
    Color c = new Color(255, 255, 255);

    public SaltaCasella() {
    final JPanel p = new JPanel();
    this.setLayout(null);
    this.setBackground(new Color(0, 0, 0));

    JLabel titoloIstruzioni = new JLabel("Istruzioni:");
    titoloIstruzioni.setBounds(new Rectangle(680, 30, 100, 20));
    titoloIstruzioni.setForeground(c);
    this.add(titoloIstruzioni);

    JLabel istruzioni1 = new JLabel("Scopo del gioco e' riempire quanto piu' possibile la matrice con numeri");
    JLabel istruzioni2 = new JLabel("progressivi da 1 a NxN, dove N è un numero arbitrario iniziale ");
    JLabel istruzioni3 = new JLabel("a scelta del giocatore, che definisce la grandezza della matrice.");
    JLabel istruzioni4 = new JLabel("A partire da una casella a scelta, ci si può muovere orizzontalmente,");
    JLabel istruzioni5 = new JLabel("saltando però due caselle, o diagonalmente, saltandone una sola.");
    JLabel istruzioni6 = new JLabel("Buon divertimento!");
    istruzioni1.setBounds(new Rectangle(680, 60, 450, 20));
    istruzioni2.setBounds(new Rectangle(680, 80, 450, 20));
    istruzioni3.setBounds(new Rectangle(680, 100, 450, 20));
    istruzioni4.setBounds(new Rectangle(680, 120, 450, 20));
    istruzioni5.setBounds(new Rectangle(680, 140, 450, 20));
    istruzioni6.setBounds(new Rectangle(680, 160, 450, 20));
    istruzioni1.setForeground(c);
    istruzioni2.setForeground(c);
    istruzioni3.setForeground(c);
    istruzioni4.setForeground(c);
    istruzioni5.setForeground(c);
    istruzioni6.setForeground(c);
    this.add(istruzioni1);
    this.add(istruzioni2);
    this.add(istruzioni3);
    this.add(istruzioni4);
    this.add(istruzioni5);
    this.add(istruzioni6);

    JLabel dimensione = new JLabel("Dimensione matrice: (numero compreso tra 5 e 10 inclusi)");
    dimensione.setBounds(new Rectangle(680, 220, 600, 20));
    dimensione.setForeground(c);
    this.add(dimensione);

    matrice = new JTextField();
    matrice.setBounds(new Rectangle(820, 220, 20, 20));
    matrice.setEditable(true);
    this.add(matrice);

    //JButton Gioca
    gioca = new JButton("Gioca");
    gioca.setBounds(new Rectangle(680, 250, 100, 20));
    gioca.addActionListener(new ListenerGioca());
    this.add(gioca);

    //JButton Reset
    reset = new JButton("Reset");
    reset.setBounds(new Rectangle(820, 250, 100, 20));
    reset.addActionListener(new ListenerReset());
    reset.setEnabled(false);
    this.add(reset);

    //Cronometro di gioco da finire!!!
    JLabel tempoGioco = new JLabel("Game Timer: ");
    tempoGioco.setBounds(new Rectangle(680, 280, 200, 20));
    tempoGioco.setForeground(c);
    this.add(tempoGioco);

    cronometro = new JTextField("00:00");
    cronometro.setBounds(new Rectangle(820, 280, 80, 20));
    cronometro.setEditable(false);
    this.add(cronometro);

    timer=new Timer(1000,new TimerGioco());

    rettangolo = new Rectangle2D.Double();

    }

    public void rimuoviPulsantiera() {

    for (int i = 0; i <= N - 1; i++)
    for (int j = 0; j <= N - 1; j++) {
    this.remove(b[i][j]);
    }
    }

    public void disegnaPulsantiera() {
    b = new JButton[N][N];
    for (int i = 0; i <= N - 1; i++)
    for (int j = 0; j <= N - 1; j++) {
    b[i][j]= new JButton();
    this.add(b[i][j]);
    }


    for (int i = 0; i <= N - 1; i++)
    for (int j = 0; j <= N - 1; j++)
    b[i][j].setBounds(new Rectangle((i * 50) + 60, (j * 50) + 60, 50, 50));

    for (int i = 0; i <= N - 1; i++)
    for (int j = 0; j <= N - 1; j++)
    b[i][j].setText("_");

    for (int i = 0; i <= N - 1; i++)
    for (int j = 0; j <= N - 1; j++)
    b[i][j].addActionListener(new ListenerPulsantiera());


    repaint();
    }


    public void numeriProgressivi() {
    numBottoni=new int [100];
    for(int p=0; p<100; p++)
    numBottoni[p] = p+1;
    mm=numBottoni[p];

    }

    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.WHITE);
    rettangolo.setFrame(650, 10, 480, 550);
    g2.draw(rettangolo);

    }

    /*Listener 1. del pulsante gioca che mi deve leggere il JTaxtField, dunque disegnare la matrice giusta
    e attivare il timer in un JLabel ineditable nn ancora creato
    2. listener sul ToogleButton che mi dà le caselle che posso cliccare e mi setta un testo con setText e un incremento(for) */

    private class ListenerGioca implements ActionListener {
    private String valoreString;
    private int valoreInt;

    public void actionPerformed(ActionEvent e) {

    valoreString = matrice.getText();
    try {
    valoreInt = Integer.parseInt(valoreString);
    }
    catch (NumberFormatException exception) {
    JOptionPane.showMessageDialog(null, "Ah ah ah!!! Ti serve qualche ripetizione di matematica!!!", "ATTENZIONE!!!", JOptionPane.WARNING_MESSAGE);
    matrice.setText("");
    matrice.setEditable(true);
    valoreInt=0;
    }

    N = valoreInt;
    disegnaPulsantiera();
    gioca.setEnabled(false);
    reset.setEnabled(true);
    timer.start();
    repaint();

    }
    }

    private class ListenerPulsantiera implements ActionListener {

    public void actionPerformed(ActionEvent e) {
    //E' QUI IL PROBLEMA!!!!!!
    numeriProgressivi();
    b[i][j].setText("" + mm);
    System.out.println(mm);
    p++;
    }
    }

    private class ListenerReset implements ActionListener {

    public void actionPerformed(ActionEvent e) {
    gioca.setEnabled(true);
    reset.setEnabled(false);
    rimuoviPulsantiera();
    N = 0;
    matrice.setText("");
    repaint();
    timer.stop();
    secondi=0;
    minuti=0;
    cronometro.setText("00:00");
    }
    }

    private class TimerGioco implements ActionListener {

    public void actionPerformed(ActionEvent e) {
    secondi++;
    if (secondi>60) {
    minuti++;
    secondi=0;
    }
    cronometro.setText(minuti+":"+secondi);
    }
    }


    public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setContentPane(new SaltaCasella());
    f.setTitle("Salta Casella");
    f.setSize(1150, 630);
    f.setResizable(false);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);


    }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Help! array di jButton

    Originariamente inviato da "MM"
    in modo da dirgli che su QUELL BOTTONE doveva mettere QUEL NUMERO.... ESISTE UN METODO CHE PUO' FARE CIO'???
    L'oggetto che ha "originato" l'evento (nel tuo caso un JButton) te lo fornisce il ActionEvent, vedi getSource() (chiaramente devi fare un cast).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    ...

    Scusami...nn ho capito... Potresti spiegarmelo meglio?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: ...

    Originariamente inviato da "MM"
    Scusami...nn ho capito... Potresti spiegarmelo meglio?
    codice:
    public void actionPerformed(ActionEvent e) {
        JButton srcButton = (JButton) e.getSource();
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5

    re:re: ...

    OH MIO DIO FUNZIONA!!!!!
    Grazie grazie 1000!!!! sei un grande!!!

    Ora ci sarebbe un secondo problema. Devo far si che ogni volta che clicco un pulsante mi restino attivi solo i pulsanti cliccabili secondo le regole del salta casella (cioè devo saltare 2 caselle il orizontale e verticale, e 1 in diagonale). Avevo precedentemente provato con i setEnabled ma anche in quel caso nn riuscivo a far capire al programma qual'era il pulsante cliccato correntemente. Ho provato rapidamente ora con getSource(), però questo restituendomi un button nn mi permette di dire all'array di lasciarmi attivi solo quelli con quelle caratteristiche...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: re:re: ...

    Originariamente inviato da "MM"
    Avevo precedentemente provato con i setEnabled ma anche in quel caso nn riuscivo a far capire al programma qual'era il pulsante cliccato correntemente. Ho provato rapidamente ora con getSource(), però questo restituendomi un button nn mi permette di dire all'array di lasciarmi attivi solo quelli con quelle caratteristiche...
    In sostanza deduco che innanzitutto devi stabilire quale è la riga/colonna del pulsante premuto. In casi come questi può essere molto utile estendere JButton e definire 2 nuove proprietà, accessibili con i soliti metodi getter.

    codice:
    public class PulsanteCella extends JButton {
        private int riga;
        private int colonna;
    
        public PulsanteCella(int riga, int colonna) {
            // assegni variabili ...
        }
    
        // metodi getter getRiga() e getColonna()
    }
    Quindi istanzi dei PulsanteCella e non più direttamente JButton. E nel actionPerformed sai che il sorgente sarà un PulsanteCella, quindi fai il cast a PulsanteCella e ottieni riga/colonna con gli appositi metodi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Giusto giusto!
    Adesso ci provo subito!

  8. #8
    ...emh...
    Dunque ho capito l'utilità e il funzionamento della cosa, ma... in pratica nella nuova classe PulsanteCella devo creare due nuovi metodi getRiga() e getColonna() che mi permettono di "prendere" la posizione (cioè le caratteristiche riga e colonna) del pulsante al'interno della griglia dell'array? Non ho mai creato un nuovo metodo...quindi nn lo so fare... O ho capito male?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da "MM"
    Dunque ho capito l'utilità e il funzionamento della cosa, ma... in pratica nella nuova classe PulsanteCella devo creare due nuovi metodi getRiga() e getColonna() che mi permettono di "prendere" la posizione (cioè le caratteristiche riga e colonna) del pulsante al'interno della griglia dell'array? Non ho mai creato un nuovo metodo...quindi nn lo so fare... O ho capito male?
    Nel codice che ho messo sopra ci sono 2 variabili di istanza .... i due getter devono semplicemente restituire quelle!!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    public class PulsanteCella extends JButton {
    private int riga;
    private int colonna;

    public PulsanteCella(int riga, int colonna) {

    }
    riga=getRiga();
    colonna=getColonna();

    }

    Temo che questo sia sbagliato (anzi lo è perchè mi da errore e per di più mi rendo conto che NN ESISTE quello che ho scritto!...) ...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.