|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
[JAVA] MasterMind: imparando ad usare NetBeans GUI Editor...
Salve a tutti, sto iniziando ad imparare il linguaggio Java. Purtroppo ho delle direttive ben precise, ad esempio devo usare NetBeans e il suo editor di GUI per realizzare una mia versione del famoso gioco Mastermind. Mi sono messo al lavoro da poco, ed il primo problema col quale mi scontro è l'incapacità (mia) di creare array di oggetti grafici (label, ecc...). Volevo chiedervi se è possibile e, se sì, come farlo.
Il problema in pratica sta nel fatto che altrimenti ogni singolo piolo di ogni singola combinazione è un elemento a sè stante, per un totale di 32 oggetti, per ognuno dei quali, al momento, ho previsto le seguenti istruzioni: Codice:
private void x8y1MouseEntered(java.awt.event.MouseEvent evt) {
int riga=8;
if(riga==8)
x8y1.setBackground(new java.awt.Color(200, 200, 200));
}
private void x8y1MouseExited(java.awt.event.MouseEvent evt) {
int riga=8;
if(riga==8)
x8y1.setBackground(new java.awt.Color(159, 159, 159));
}
private void x8y1MouseClicked(java.awt.event.MouseEvent evt) {
if(!x8y1.isEnabled())
{
x8y1.setIcon(ColorSelectedG.getIcon());
x8y1.setEnabled(rootPaneCheckingEnabled);
miacomb[0]=c;
x++;
if(x==4)
nebi=ctrl.check(miacomb, codice);
}
}
A questo si aggiungono altri problemi, ad esempio volendo colorare i pioli bianchi e neri relativi ad una soluzione, sarebbe molto comodo usare un ciclo for se si avesse a disposizione un array di oggetti Label. So di non essere stato chiaro, ma più di così non ci riesco. Confido nel fatto che qualcuno di voi nel corso dei propri studi si sia imbattuto nell'implementazione di Mastermind in Java. Grazie per l'aiuto.
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
non ho mai "avuto a che fare" con MasterMind ma utilizzo anche io NetBeans (in efetti è un tantino sovvradimensionato come ambiente di sviluppo per chi inizia Se vuoi crearti un array di Label (JLabel presumo, usi Swing?) allora non devi prenderle una a una dalla palette dei componenti grafici e trascinarle nella tua finestra, perchè così Matisse (l'editor grafico di GUI di NetBeans) crea un'istanza per ogni singola JLabel che ti finisce nel "codice blindato" della tua classe. Per ovviare al problema devi lasciar perdere l'inserimento delle JLabel da edit grafico e crearti te direttamente nel codice della tua classe una variabile (per esempio) di tipo ArrayList<JLabel>, oppure (se ancora non sei familiare con Collections & Generics) una variabile di tipo JLabel[] (array di JLabel). Poi nel codice ti devi gestire a mano l'istanziazione delle singole JLabel (che potresti inserire nel costruttore della tua classe, dopo la chiamata al metodo initComponents() aggiunta da Matisse[serve a inizializzare i componenti grafici]).
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Grazie mille per la risposta! Però non sono in grado di metterla a punto, avrei bisogno di una mano...
Allora se non ho capito male potrei fare qualcosa del genere: Codice:
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
JLabel[] array = new JLabel[number]; //questo l'ho trovato su google :p
x8y1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
x8y1MouseClicked(evt);
}
});
Riga8.add(x8y1, new java.awt.GridBagConstraints());
pack();
}
In effetti se imparassi a fare questa cosa poi il resto sarebbe in discesa, perchè praticamente ogni componente del campo da gioco diventerebbe parte di un array (riga), o addirittura, se possibile, potrei fare un array di righe, in cui ogni riga è un array di Jlabel (che uso come container per piccole immagini). Quindi grazie a chiunque come banryu79 mi darà una mano! ![]() PS: Sto cercando guide online per questa cosa, anche in inglese, ma con scarso successo. Anche un piccolo link sarebbe d'aiuto.
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
Ultima modifica di riva.dani : 26-06-2008 alle 15:53. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ehm, come dire, ti avevo già risposto anche su questo:
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Scusa, forse due righe di codice sarebbero d'aiuto. Non ho idea di come si faccia quello che mi consigli di fare. Per ora ho creato una nuova classe "riga" in un nuovo file per evitare casini, e ci ho scritto questo:
Codice:
package mastermind;
import javax.swing.JLabel;
public class riga {
JLabel[] elemento = new JLabel[4];
public riga() {
for (int y = 0; y < 4; y++) {
elemento[y] = new JLabel();
}
}
}
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2007
Messaggi: 677
|
Ecco cosa intendeva banryu!
Codice:
package mastermind;
import javax.swing.JLabel;
public class riga {
public riga(){
initComponents()
JLabel[] elemento = new JLabel[4];
/* Tutto il codice da aggiungere
*va inserito da qui!!!
*/
for (int y = 0; y < 4; y++) {
elemento[y] = new JLabel();
}
}
/*Codice generato da NB*/
public void initComponents(){
........
}
}
}
__________________
Desktop: (In Vendita) iMac (12,2) 27" --> i5 QaudCore 2,7GHz, 8GB RAM, 1TB HDD.. Laptop (In Pensione): MacBook PRO (3,1) 15.4" (Glossy, ma pentito) --> 2.2Ghz, 4GB Ram.. Camera: Nikon D80 with Nikkor 18-55mm 1:3-5.6 GII + Nikkor 55-200mm 1:4-5.6 VR "Mobile": iPhone 5 64Gb MyEbay: 100%! • Mercatino (Green = Good; Red = Bad) UncleSam, Boxi80, Zuckerbaer, lamerone, danidj, maxmax80 |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Grazie 1000!
Ma il mio problema persiste poichè vi è già un Codice:
/** Creates new form Interfaccia*/
public Interfaccia() {
initComponents();
}
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
Ultima modifica di riva.dani : 26-06-2008 alle 18:01. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
l'array di JLabel lo hai già istanziato nel codice che hai postato qui sopra.
Perdonami, ma non avendo mai giocato a MasterMind non so se il numero di JLabel che ti occorrono sia fisso e conosciuto a priori o sia dinamico... Quote:
Ad esempio per settare la posizione puoi usare il metodo .setLocation(x, y) che JLabel eredita da Component . In pratica devi cominciare a studiarti le basi di AWT e Swing, sul sito della Sun trovi molti tutorial ben strutturati, ovviamente in inglese. Devi fare tutto da codice propio perchè a te occorre un array di JLabel, cosa che l'editor grafico non ti permette di gestire in modo visuale. P.S.: initComponents() viene gestito automaticamente da Netbeans, non devi ne scriverci niente dentro (tanto non puoi) ne chiamarlo tu una seconda volta. Io intendevo che il tuo codice per istanziare l'array e popolarlo con le JLabel lo potresti scrivere dopo la chiamata a initComponets() che di solito viene automaticamente inserita nel costruttore della classe visuale, tutto lì.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Il numero di componenti è fisso, almeno questo è un vantaggio!
Quindi tutto da codice? Ok proverò, e proverò pure ad usare i metodi che mi hai consigliato (tipo .setLocation). Tanto sono libero di scopiazzare dal codice che NB ha generato (proprio quello che non posso modificare). Mi avete sbloccato la mente... Mi stanno venendo un po' di idee nuove, ad esempio creare le JLabel solo quando servono. Quindi per ora grazie mille ad entrambi, se avrò altri problemi scriverò ancora qui! Alla prossima!
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2007
Messaggi: 677
|
Quote:
Codice:
/** Creates new form Interfaccia*/
public Interfaccia() {
initComponents();
/* Tutto il codice da aggiungere
*va inserito da qui!!!
*/
JLabel[] elemento = new JLabel[4];
for (int y = 0; y < 4; y++) {
elemento[y] = new JLabel();
}
}
__________________
Desktop: (In Vendita) iMac (12,2) 27" --> i5 QaudCore 2,7GHz, 8GB RAM, 1TB HDD.. Laptop (In Pensione): MacBook PRO (3,1) 15.4" (Glossy, ma pentito) --> 2.2Ghz, 4GB Ram.. Camera: Nikon D80 with Nikkor 18-55mm 1:3-5.6 GII + Nikkor 55-200mm 1:4-5.6 VR "Mobile": iPhone 5 64Gb MyEbay: 100%! • Mercatino (Green = Good; Red = Bad) UncleSam, Boxi80, Zuckerbaer, lamerone, danidj, maxmax80 |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Anzi, spesso gli impone di sapere bene cosa sta andando a fare perchè per interfacce un po' più complesse della norma è neccessario integrare/affiancare il codice prodotto in automatico da Matisse con del codice ad hoc gestito a mano.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Rinnovo i miei ringraziamenti, ma ancora non ci sono...
Vi ho detto che sono niubbo, perchè sono completamente a digiuno di Java. Però con un po' di buona volontà ho scritto questo: Codice:
package mastermind;
import java.awt.event.*;
import javax.swing.JLabel;
public class riga {
JLabel[] elemento = new JLabel[4];
public riga() {
for (int y = 0; y < 4; y++) {
elemento[y] = new JLabel();
elemento[y].addMouseListener(new Ascoltatore());
elemento[y].setIcon(new javax.swing.ImageIcon((getClass().getResource("/immagini/nero.jpg"))));
elemento[y].setLocation(50, 50); //50 e 50 sono valori messi lì a casaccio :p
}
}
public class Ascoltatore implements MouseListener
{
public void mouseClicked(MouseEvent e, int k) {
elemento[k].setBackground(new java.awt.Color(50, 50, 50));
}
public void mousePressed(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseReleased(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseEntered(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseExited(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseClicked(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
Codice:
...
riga row=new riga();
row[0]. //la parte dopo il punto sparisce automaGicamente
@Override
public void setBackground(Color c) {
super.setBackground(c);
}
...
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Detta in parole povere, in AWT ogni "oggetto grafico" è un Component. Alcuni Component sono anche Container, cioè possono contenere al loro interno altri Component. Nel tuo caso per esempio, le JLabel sono dei Component che tu hai creato; ora devi "inserirle" in un Container. Tipicamente i componenti di un JFrame (suppongo tu stia usando un JFrame come top level container) vengono inseriti nel ContentPane che ha all'interno (diciamo l'area client della finestra, anche se non è proprio una definizione esatta). Ogni Container espone un metodo pubblico del tipo .add(Component...) che permette di inserire il Component passato in ingresso nel Container. Quindi nel tuo caso sarà il JFrame il tuo container (posto che non ci hai prima aggiunto dentro un JPanel). La faccenda qui te l'ho sintetizzata tantissimo, ti ripeto e invito a spendere 3-4 orette sul sito della Sun a consultare il Javadocs del package java.awt e javax.swing mentre studi il tutorial su Awt i Component. Se vuoi tutorial specifici per componenti li trovi sempre in quel sito. P.S.: per il posizionamento delle JLabel ti ho detto una castroneria: non usare setLocation() (che tipicamente di usa per posizionare finestre), quando avrai aggiunto col metodo .add() le JLabel nel container il LayoutManager associato a quel container provvederà lui a posizionare i componenti al suo interno. Quindi è necessario che tu conosca almeno un po' i LayoutManager... Qui del materiale su come si usare i componenti di Swing. Qua la pagina dei Java tutorials
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 27-06-2008 alle 09:55. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Avevo già visitato i due link, comunque grazie!
Forse mi ero espresso male, quello che non riuscivo a fare era: tasto destro su un JPanel creato col GUI editor, "Customize code", ed aggiungere come post-adding code due righe del tipo: Codice:
for (int y = 0; y < 4; y++)
Pannello1.add(elemento[y]);
![]() PS: Mi stavo chiedendo, già che ci sono, se si può creare un unico mouseListener per l'array, al quale passare anche l'indice dell'array. In questo modo potrei definire una sola volta le azioni da compiere. Ad esempio, qualcosa del genere: Codice:
for (y = 0; y < 4; y++)
{Riga.add(row[y]);
row[y].addMouseListener(new Ascoltatore());
}
...
public class Ascoltatore implements MouseListener
{
public void mouseClicked(MouseEvent e) {
row[y].setBackground(250, 250, 250);
}
}
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
Ultima modifica di riva.dani : 29-06-2008 alle 11:53. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2006
Messaggi: 22462
|
se ho capito bene; te vorresti screare un solo ascoltatore di eventi che faccia lo stesso lavoro a tutti?
potresti passare come parametro alla classe Ascoltatore il numero della colonna, con un codice tipo questo Codice:
for(int i=0;i<4;i++){
Ascoltatore a=new Ascoltatore(i);
row[y].addMouseListener(a);
}
//...
class Ascoltatore implemets MouseListener{
private int row=0;
public Ascoltatore(int y){
this.row=y;
}
//TODO: il tuo codice
}
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Quote:
Codice:
...
class Ascoltatore implemets MouseListener{
public int row=0;
public Ascoltatore(int y){
this.row=y;
}
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2006
Messaggi: 22462
|
non se dici a me; comunque grazie per avermi fatto notare l'errore
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:18.





















