A mio parere le tue classi 'Quindici' e 'MyMenuBar' non sono al momento la parte "importante" del programma, dovresti concentrarti più sulla logica del gioco e dell'interazione che avrà l'utente con il pannello dove si svolgerà il gioco.
Questo a meno che tu non volessi sviluppare tutta la logica del gioco nella classe del JFrame, ma io ti consiglierei di spezzarlo in più parti:
- Una classe che funga da "modello", che memorizzi cioè la situazione corrente del campo di gioco (es. in una matrice), e abbia metodi per controllare che il gioco sia vinto, mischiare i numeri casualmente all'inizio della partita, fare l'aggiornamento dopo ogni mossa etc.
- Una classe che funga da "vista", che inglobi un'istanza della classe modello, e vada ad interagire con essa: ai pulsanti andresti quindi a settare ogni volta il testo in base al numero che in quel momento è presente sul campo di gioco, e alla pressione di un pulsante andresti ad aggiornare il modello.
Poi avrai ovviamente i listener.
Non è ovviamente l'unico modo, potresti anche associare ogni pulsante a un numero e spostare direttamente il pulsante, mantenendo fisso il numero, ma io eviterei questo approccio, la parte logica del programma non è bene incapsulata e sei più esposto ad errori e problemi.
In ogni caso se usi dei pulsanti ci dovrà essere un qualche spostamento, perché se non sbaglio lo spazio vuoto della griglia cambia durante il gioco, io comunque lo limiterei il più possibile...
Che tipo di layout pensavi di adottare per sistemare i bottoni nella griglia? Un GridLayout? Un GridBagLayout? Altro?
Diciamo che con un GridLayout lo spazio vuoto sarebbe un po' un problema, di solito si aggiunge un componente vuoto alla griglia, ma poi per fare gli spostamenti penso che tu sia costretto a togliere i componenti e reinserirli nel giusto ordine, mentre con un GridBagLayout dovrebbe essere possibile agire sulle coordinate dei compoenenti e semplificare un po' questa parte, con altri layout adesso non saprei (ma non usare il posizionamento assoluto!).
Potresti anche optare per una diversa soluzione (che è quella implementata ad esempio in
questo programmino che ho trovato online): non usi pulsanti o altri componenti, ma disegni tu la griglia nel pannello facendo l'override del paintComponent per il tuo pannello e utilizzando i metodi della classe Graphics.
Secondo me queste scelte dovrebbero determinare il modo in cui imposterai poi le altre classi, come dice @andbin estendere JMenuBar potresti anche evitarlo, aggiungo io che c'è anche una corrente di pensiero (predominante nel link che sto per fornirti) che suggerisce di non estendere JFrame.
Questo per più motivi, ma in particolare perché un JPanel è più flessibile, e se fai una classe es. GamePanel che contiene tutta la logica dell'interfaccia poi puoi aggiungerla a un JFrame, JDialog, JApplet, o inserirlo dentro un altro pannello (ad esempio in un CardLayout per scambiare i pannelli come potresti fare tra un menù e il pannello di gioco etc.).
Se ti interessa il link della discussione è questo:
https://stackoverflow.com/questions/22003802/extends-jframe-vs-creating-it-inside-the-program , poi non voglio assolutamente dire che una delle due soluzioni "sia sbagliata" (personalmente ho usato entrambi gli approcci più volte), era solo per dirti di pensare prima al cuore del programma, che poi il resto è "di contorno".
Per concludere in generale il fatto di "mischiare" i numeri lo puoi ottenere facilmente con metodi già implementati come Collections.shuffle (), è da vedere però a che livello vuoi agire, se mischiare direttamente i pulsanti o mischiare i numeri in una matrice o in una qualche altra struttura dati per poi modificare la tua interfaccia di conseguenza (io appunto farei in questo modo).
Per qualsiasi cosa siamo qui