Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme e Aston Martin Aramco F1 Team si sono (ri)unite dando alla vita un flagship con chip Snapdragon 8 Elite Gen 5 e design esclusivo ispirato alle monoposto di Formula 1. La Dream Edition introduce la nuova colorazione Lime Essence abbinata al tradizionale Aston Martin Racing Green, decorazioni intercambiabili personalizzate e una confezione a tema F1, intorno a uno smartphone dall'ottima dotazione tecnica con batteria da 7000mAh ricaricabile a 120W e isola fotografica intercambiabile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-07-2009, 10:38   #1
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
[Java] Confronto tra icone e icone di bottoni (Campo Minato)

Ciao a tutti, sto progettando un applicazione che gestisca il gioco del Campo Minato e per il sistema di gioco sono ormai arrivato a concluderlo, mi serve il vostro aiuto per risolvere l'ultimo problema legato alla costruzione dei numeri che segnalano le mine confinanti.

Purtroppo non ho ancora generato il Javadoc e quindi il codice non è ancora commentato, quindi vi spiego qui tutti i vari campi e metodi delle classi in esame.

Questa è la classe progettata per gestire il sistema del gioco:

Codice:
package campoMinato;

import java.util.Random;
import javax.swing.*;
import componenti.*;

public class MyGameSystem {
	
	private JButton [][] game;
	private int rows, cols, mines, row, col, index;
	private Random newrow, newcol;
	private GenericComponent component;
	
	public MyGameSystem(JButton [][] game, int rows, int cols, int mines) {
		this.game = game;
		this.rows = rows;
		this.cols = cols;
		this.mines = mines;
		newrow = new Random();
		newcol = new Random();
	}
	
	public void CreateGame() {
		for (index = 0; index < mines; index++) {
			row = newrow.nextInt(rows);
			col = newcol.nextInt(cols);
			CreateMines(row,col);
		}
		CreateNumbers();
	}
	
	public void CreateMines(int r, int c) {
		if (game[r][c].getDisabledIcon() == null) {
			component = new MineComponent("Icone/j9.gif");
			game[r][c].setDisabledIcon(component.getIcon());
		} else {
			index--;
		}
	}
	
	public void CreateNumbers() {
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				if (game[i][j].getDisabledIcon() == null) {
					int n_mines = CountMines(i,j);
					switch (n_mines) {
					case 0: {
						component = new NumberComponent("Icone/j0.gif");
						game[i][j].setDisabledIcon(component.getIcon());
						break;
					}
					case 1: {
						component = new NumberComponent("Icone/j1.gif");
						game[i][j].setDisabledIcon(component.getIcon());
						break;
					}
					case 2: {
						component = new NumberComponent("Icone/j2.gif");
						game[i][j].setDisabledIcon(component.getIcon());
						break;
					}
					case 3: {
						component = new NumberComponent("Icone/j3.gif");
						game[i][j].setDisabledIcon(component.getIcon());
						break;
					}
					case 4: {
						component = new NumberComponent("Icone/j4.gif");
						game[i][j].setDisabledIcon(component.getIcon());
						break;
					}
					case 5: {
						component = new NumberComponent("Icone/j5.gif");
						game[i][j].setDisabledIcon(component.getIcon());
						break;
					}
					case 6: {
						component = new NumberComponent("Icone/j6.gif");
						game[i][j].setDisabledIcon(component.getIcon());
						break;
					}
					case 7: {
						component = new NumberComponent("Icone/j7.gif");
						game[i][j].setDisabledIcon(component.getIcon());
						break;
					}
					case 8: {
						component = new NumberComponent("Icone/j8.gif");
						game[i][j].setDisabledIcon(component.getIcon());
						break;
					}
					}
				}
			}
		}
	}
	
	public int CountMines(int r, int c) {
		int n_mines = 0;
		for (int i = r-1; i <= r+1; i++) {
			for (int j = c-1; j <= c+1; j++) {
				if (((i >= 0) && (j >= 0)) && ((i < rows) && (j < cols))) {
					if (game[i][j].getDisabledIcon() == null)
						n_mines++;
				}
			}
		}
		return n_mines;
	}

}
Campi:

game: Matrice di bottoni che rappresenta la griglia di gioco.
rows: Intero che rappresenta il numero di righe di game.
cols: Intero che rappresenta il numero di colonne di game.
mines: Intero che rappresenta le mine che verranno inserite in game.
row: Intero che rappresenta una riga generata a caso.
col: Intero che rappresenta una colonna generata a caso.
index: Intero che dice a runtime quante mine sono gia state create in game.
newrow: Oggetto di classe Random che genererà una riga.
newcol: Oggetto di classe Random che genererà una colonna.
component: Oggetto che crea all'occorrenza l'icona mina o numero.

Metodi:

MyGameSystem() : Costruttore della classe.

void CreateGame(): Metodo pubblico che crea il sistema di gioco utilizzando i metodi CreateMines() e CreateNumbers(). Il compito principale del metodo è quello di creare righe e colonne a caso nella griglia dove verranno inserite inanzitutto le mine.

void CreateMines(): Metodo (pubblico) che utilizza come parametri gli interi rappresentanti la riga e colonna generati in CreateGame() per creare e inserire in griglia le mine (icona del bottone disabilitato).

void CreateNumbers(): Metodo (pubblico) che una volta messe le mine in griglia si occupa di inserire nelle caselle rimaste i numeri (icona del bottone disabilitato) corrispondenti alle mine confinanti. Viene utilizzato il metodo intero CountMines() per contare queste mine confinanti e a seconda del valore restituito creare l'icona giusta da settare ai bottoni.

int CountMines(): QUI STA IL MIO PROBLEMA Metodo intero (pubblico) che passati come parametri una riga e una colonna di un bottone, inizia un controllo nella griglia sulle 8 caselle confinanti al bottone, tralasciando le caselle con riga e colonna negative oppure fuori dai limiti della matrice. Questo metodo dovrebbe riconoscere SOLO l'icona mina e incrementare la variabile corrispondente alle mine confinanti da restituire, ma INVECE riconosce qualsiasi casella in cui sia stata gia settata l'icona del bottone disabilitato.

So che l'errore è alla riga: if (game[i][j].getDisabledIcon() == null)
perchè debbuggando in Eclipse mi entra e quindi incrementa la variabile anche quando trova un icona numero, quindi ho cercato di togliere il null e di confrontare l'icona del bottone disabilitato con l'icona della mina, ma il risultato non è stato quello aspettato, anzi è stato peggiorativo perchè non riconosceva nemmeno più le mine.

Dunque in pratica, dovrei confrontare l'icona del bottone disabilitato con quella della mina che dovrebbero risultare uguali e invece non lo sono. C'è qualcuno che può aiutarmi?

Spero di essere stato chiaro nell'esporvi il codice, se avete bisogno di migliori spiegazioni oppure anche delle classi GenericComponent, MineComponent, NumberComponent, ditelo che li posto tranquillamente.
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 15-07-2009, 11:38   #2
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Simone89RN Guarda i messaggi
Ciao a tutti, sto progettando un applicazione che gestisca il gioco del Campo Minato e per il sistema di gioco sono ormai arrivato a concluderlo, mi serve il vostro aiuto per risolvere l'ultimo problema legato alla costruzione dei numeri che segnalano le mine confinanti.

Purtroppo non ho ancora generato il Javadoc e quindi il codice non è ancora commentato, quindi vi spiego qui tutti i vari campi e metodi delle classi in esame.

Questa è la classe progettata per gestire il sistema del gioco:

Codice:
[CUT]
Campi:

game: Matrice di bottoni che rappresenta la griglia di gioco.
rows: Intero che rappresenta il numero di righe di game.
cols: Intero che rappresenta il numero di colonne di game.
mines: Intero che rappresenta le mine che verranno inserite in game.
row: Intero che rappresenta una riga generata a caso.
col: Intero che rappresenta una colonna generata a caso.
index: Intero che dice a runtime quante mine sono gia state create in game.
newrow: Oggetto di classe Random che genererà una riga.
newcol: Oggetto di classe Random che genererà una colonna.
component: Oggetto che crea all'occorrenza l'icona mina o numero.
[CUT]
Potresti postare il codice che richiama il costruttore, e in particolare il codice che inizializza la matrice di JButton??

Comunque le icone settate sui pulsanti non sono certo il modo migliore di gestire l'applicazione. Un po' di sano MVC non fa mai male..
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 15-07-2009, 12:11   #3
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
Quote:
Originariamente inviato da malocchio Guarda i messaggi
Potresti postare il codice che richiama il costruttore, e in particolare il codice che inizializza la matrice di JButton??

Comunque le icone settate sui pulsanti non sono certo il modo migliore di gestire l'applicazione. Un po' di sano MVC non fa mai male..
Allora ti posto 2 classi, la 1° è quella che usa il costruttore, la 2° invece possiede i metodi che danno righe e colonne della matrice:

Codice:
package campoMinato;

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

public class MyGamePanel extends JPanel {
	
	private JButton [][] game; 
	MyGameSystem system;
	
	public MyGamePanel(MyNewGameDialogBox attributes) {
		super(new GridLayout(attributes.getAltezza(), attributes.getLarghezza()));
		game = new JButton [attributes.getAltezza()][attributes.getLarghezza()];
		for (int i = 0; i < attributes.getAltezza(); i++) {
			for (int j = 0; j < attributes.getLarghezza(); j++) {
				game[i][j] = new JButton();
				add(game[i][j]);
			}
		}
		system = new MyGameSystem(game,attributes.getAltezza(),attributes.getLarghezza(),attributes.getMines());
		system.CreateGame();
	}
	
	
	

}
Codice:
package campoMinato;

import javax.swing.*;
import java.awt.*;
import ascoltatori.*;

public class MyNewGameDialogBox extends JDialog {
	
	private Box labels, textfields, buttons;
	private JButton ok, annulla;
	private JTextField width, height, mines;
	private MyFrame mainFrame;
	
	public MyNewGameDialogBox(MyFrame parent) {
		super(parent,"Nuova Partita");
		mainFrame = parent;
		setLayout(new FlowLayout());
		setSize(200,200);
		labels = Box.createVerticalBox();
		textfields = Box.createVerticalBox();
		buttons = Box.createVerticalBox();
		height = new JTextField(3);
		width = new JTextField(3);
		mines = new JTextField(3);
		ok = new JButton("OK");
		annulla = new JButton("Annulla");
		labels.add(new JLabel("Altezza:"));
		labels.add(Box.createVerticalStrut(20));
		labels.add(new JLabel("Larghezza:"));
		labels.add(Box.createVerticalStrut(20));		
		labels.add(new JLabel("Mine:"));
		textfields.add(height);
		textfields.add(Box.createVerticalStrut(20));
		textfields.add(width);
		textfields.add(Box.createVerticalStrut(20));
		textfields.add(mines);
		buttons.add(ok);
		buttons.add(Box.createVerticalStrut(40));
		buttons.add(annulla);
		Container c = getContentPane();
		c.add(labels);
		c.add(textfields);
		c.add(buttons);
		ok.addActionListener(new MyNewGameDialogBoxListener(mainFrame, this));
		annulla.addActionListener(new MyNewGameDialogBoxListener(mainFrame, this));
	}
	
	public int getAltezza() {
		int h = Integer.parseInt(height.getText());
		return h;
	}
	
	public int getLarghezza() {
		int h = Integer.parseInt(width.getText());
		return h;
	}
	
	public int getMines() {
		int h = Integer.parseInt(mines.getText());
		return h;
	}

}
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 15-07-2009, 16:27   #4
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Prima di tutto: la variabile globale component dovrebbe essere locale: ogni metodo usa la propria variabile, è una questione di sicurezza e soprattutto ti aiuta a scrivere codice corretto.

Domanda: cosa fanno le classi MineComponent e NumberComponent????

Ora mi verrebbe da consigliarti di fare così: crea un array globale di icone nella classe MyGameSystem

Codice:
Icon[] icone = new Icon[10];	//dichiarazione

//nel costruttore
icone[0] = null;
for (int i = 1; i <= 9; i++) {
	icone[i] = new Icon("Icone/j"+ i +".gif");
}
Utilizza questi oggetti icona per costruire gli oggetti *Component e modifica il costruttore di questi in modo che accetti come parametro direttamente l'icona piuttosto che il suo percorso.


Codice:
public void CreateMines(int r, int c) {
		if (game[r][c].getDisabledIcon() == null) {
			component = new MineComponent(icone[9])
			game[r][c].setDisabledIcon(icone[9]);
		} else {
			index--;
		}
	}


Codice:
public int CountMines(int r, int c) {
		int n_mines = 0;
		for (int i = r-1; i <= r+1; i++) {
			for (int j = c-1; j <= c+1; j++) {
				if (((i >= 0) && (j >= 0)) && ((i < rows) && (j < cols))) {
					if (game[i][j].getDisabledIcon() == icone[9])  //c'è una mina!
						n_mines++;
				}
			}
		}
		return n_mines;
	}
Quindi icone[9] vuol dire mina, icone[1-8] vuol dire numero, icone[0] è semplicemente null


Non è di certo il massimo, ma almeno vedi se così funziona
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 15-07-2009, 18:41   #5
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
Quote:
Originariamente inviato da malocchio Guarda i messaggi
Prima di tutto: la variabile globale component dovrebbe essere locale: ogni metodo usa la propria variabile, è una questione di sicurezza e soprattutto ti aiuta a scrivere codice corretto.

Domanda: cosa fanno le classi MineComponent e NumberComponent????

Ora mi verrebbe da consigliarti di fare così: crea un array globale di icone nella classe MyGameSystem

Codice:
Icon[] icone = new Icon[10];	//dichiarazione

//nel costruttore
icone[0] = null;
for (int i = 1; i <= 9; i++) {
	icone[i] = new Icon("Icone/j"+ i +".gif");
}
Utilizza questi oggetti icona per costruire gli oggetti *Component e modifica il costruttore di questi in modo che accetti come parametro direttamente l'icona piuttosto che il suo percorso.


Codice:
public void CreateMines(int r, int c) {
		if (game[r][c].getDisabledIcon() == null) {
			component = new MineComponent(icone[9])
			game[r][c].setDisabledIcon(icone[9]);
		} else {
			index--;
		}
	}


Codice:
public int CountMines(int r, int c) {
		int n_mines = 0;
		for (int i = r-1; i <= r+1; i++) {
			for (int j = c-1; j <= c+1; j++) {
				if (((i >= 0) && (j >= 0)) && ((i < rows) && (j < cols))) {
					if (game[i][j].getDisabledIcon() == icone[9])  //c'è una mina!
						n_mines++;
				}
			}
		}
		return n_mines;
	}
Quindi icone[9] vuol dire mina, icone[1-8] vuol dire numero, icone[0] è semplicemente null


Non è di certo il massimo, ma almeno vedi se così funziona
Ti ringrazio per l'aiuto, in effetti è brutta come soluzione, ma ne ho trovata un altra da solo che credo sia meglio di questa, ho creato una matrice di booleani di dimensioni uguali a quelle della griglia di gioco e li ho settati tutti false, poi man mano che aggiungo le mine li metto a true e poi in CountMines() controllo se c'è la mina o no attraverso questa nuova matrice di booleani.

Visto che ho postato il codice ne approfitto per fare qualche domanda legata all'information hiding, oltre all'oggetto component da mettere locale, secondo te è anche meglio mettere tutti i metodi della classe MyGameSystem private anzichè public al di fuori del costruttore e del metodo CreateGame()?

Inoltre le variabili intere row e col e gli oggetti Random newrow e newcol li uso solo nel metodo CreateGame(), è meglio metterle anche quelle locali?

Ultima modifica di Simone89RN : 15-07-2009 alle 18:49.
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 15-07-2009, 19:04   #6
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Simone89RN Guarda i messaggi
Ti ringrazio per l'aiuto, in effetti è brutta come soluzione, ma ne ho trovata un altra da solo che credo sia meglio di questa, ho creato una matrice di booleani di dimensioni uguali a quelle della griglia di gioco e li ho settati tutti false, poi man mano che aggiungo le mine li metto a true e poi in CountMines() controllo se c'è la mina o no attraverso questa nuova matrice di booleani.

Visto che ho postato il codice ne approfitto per fare qualche domanda legata all'information hiding, oltre all'oggetto component da mettere locale, secondo te è anche meglio mettere tutti i metodi della classe MyGameSystem private anzichè public al di fuori del costruttore e del metodo CreateGame()?

Inoltre le variabili intere row e col e gli oggetti Random newrow e newcol li uso solo nel metodo CreateGame(), è meglio metterle anche quelle locali?
Hai fatto bene, in effetti almeno una matrice di booleani in questo caso ci vuole.
Il discorso visibilità dei membri classe è abbastanza semplice: prova a pensare ad un programma maligno che avendo accesso alle tue classi modifichi tutte i campi che può, richiami tutti i metodi a cui può accedere, in una maniera il più possibile rovinosa per il tuo programma. Ora prendi tutti i metodi e mettili private, poi seleziona i metodi che necessariamente devono essere richiamati dall'esterno della tua classe e mettili public o package(default). Ovviamente la questione è molto molto molto più complessa, e non ho neanche considerato il modificatore protected.
Possiamo in genere dire che i campi (variabili globali) di una classe sono di solito tutti private (si accedono eventualmente tramite set/get), a meno che non si tratti di costanti dichiarate final (e static) oppure di variabili che molto probabilmente devono essere utilizzate dalle sottoclassi, avendo progettato la tua classe specificatamente per essere estesa.

In generale la tua applicazione avrebbe bisogno di una riveduta globale, in quanto la progettazione delle classi non è il massimo. Sto parlando dei vari ruoli e informazioni che sono "distribuiti" nelle varie classi.

Sarebbe interessante vedere il codice delle classi *Component e dei gestori degli eventi tipo click mouse eccetera...

Adesso devo scappare, a presto
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 15-07-2009, 19:18   #7
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
Quote:
Originariamente inviato da malocchio Guarda i messaggi
Hai fatto bene, in effetti almeno una matrice di booleani in questo caso ci vuole.
Il discorso visibilità dei membri classe è abbastanza semplice: prova a pensare ad un programma maligno che avendo accesso alle tue classi modifichi tutte i campi che può, richiami tutti i metodi a cui può accedere, in una maniera il più possibile rovinosa per il tuo programma. Ora prendi tutti i metodi e mettili private, poi seleziona i metodi che necessariamente devono essere richiamati dall'esterno della tua classe e mettili public o package(default). Ovviamente la questione è molto molto molto più complessa, e non ho neanche considerato il modificatore protected.
Possiamo in genere dire che i campi (variabili globali) di una classe sono di solito tutti private (si accedono eventualmente tramite set/get), a meno che non si tratti di costanti dichiarate final (e static) oppure di variabili che molto probabilmente devono essere utilizzate dalle sottoclassi, avendo progettato la tua classe specificatamente per essere estesa.

In generale la tua applicazione avrebbe bisogno di una riveduta globale, in quanto la progettazione delle classi non è il massimo. Sto parlando dei vari ruoli e informazioni che sono "distribuiti" nelle varie classi.

Sarebbe interessante vedere il codice delle classi *Component e dei gestori degli eventi tipo click mouse eccetera...

Adesso devo scappare, a presto
Grazie per le spiegazioni. Questo topic può essere chiuso, visto che abbiamo parlato di tutt'altro argomento invece di quello che era stato preannunciato dal titolo.
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2009, 09:20   #8
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Simone89RN Guarda i messaggi
Grazie per le spiegazioni. Questo topic può essere chiuso, visto che abbiamo parlato di tutt'altro argomento invece di quello che era stato preannunciato dal titolo.
Guarda hai ragione stiamo uscendo dal topic vero e proprio, il problema è risolto, ma in questa sezione (particolarmente) succede di continuo, se non sempre!
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2009, 17:40   #9
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
Purtroppo sono sorti altri problemi. Provo a postarli qui anche se come ho gia detto non hanno a che fare nulla col titolo del topic.

Il sistema di gioco è praticamente finito, manca solo da visualizzare le icone di mine e numeri quando i bottoni sono premuti e disabilitarli, per questo ho settato l'icona del pulsante disabilitato con setDisabledIcon(), ma quando aggiungo il listener ai bottoni, e quindi nel actionPerformed() vado a disabilitare il bottone stesso facendo button.setEnabled(false) il risultato è che il bottone viene disabilitato senza che si visualizzi l'icona.

Inoltre devo gestire anche l'icona della bandierina che appare quando l'utente clicca sul tasto destro del mouse sul bottone supponendo che in quella casella ci sia una mina. So che devo usare una classe che implementi l'interfaccia MouseListener, ma non so come riconoscere se il click sia stato fatto dal pulsante sinistro e destro del mouse. Chi mi sa aiutare?
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2009, 17:57   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Per il pulsante sinistro/destro, dato il MouseEvent me:

Codice:
if(SwingUtilities.isLeftMouseButton(me)) {
...sinistro
} else if(SwingUtilities.isRightMouseButton(me)) {
...destro
}
Controlla il percorso dell'icona che usi per il pulsante disabilitato. Se usi ImageIcon e il percorso non è corretto anzichè rilasciare un'eccezione ottieni un'icona vuota - e quindi non appare nulla.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2009, 09:55   #11
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Per il pulsante sinistro/destro, dato il MouseEvent me:

Codice:
if(SwingUtilities.isLeftMouseButton(me)) {
...sinistro
} else if(SwingUtilities.isRightMouseButton(me)) {
...destro
}
Controlla il percorso dell'icona che usi per il pulsante disabilitato. Se usi ImageIcon e il percorso non è corretto anzichè rilasciare un'eccezione ottieni un'icona vuota - e quindi non appare nulla.
Ciao, ti confermo che il percorso è stato messo correttamente, perchè ho provato a cambiare setDisabledIcon() con semplicemente setIcon() lasciando tutto invariato, e facendo cosi le icone di default si vedono tutte bene, il problema viene fuori quando uso setDisabledIcon() che non fa vedere le icone quando si disattiva il bottone, hai qualche altra soluzione in proposito?
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2009, 10:22   #12
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Simone89RN Guarda i messaggi
Ciao, ti confermo che il percorso è stato messo correttamente, perchè ho provato a cambiare setDisabledIcon() con semplicemente setIcon() lasciando tutto invariato, e facendo cosi le icone di default si vedono tutte bene, il problema viene fuori quando uso setDisabledIcon() che non fa vedere le icone quando si disattiva il bottone, hai qualche altra soluzione in proposito?
Non ho mai usato questi metodi, ma hai provato a richiamare setDisabledSelectedIcon()

E' l'unica cosa che mi potrebbe venire in mente...
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2009, 10:31   #13
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
Quote:
Originariamente inviato da malocchio Guarda i messaggi
Non ho mai usato questi metodi, ma hai provato a richiamare setDisabledSelectedIcon()

E' l'unica cosa che mi potrebbe venire in mente...
Si l'avevo visto e ho provato anche questa soluzione, ma niente da fare il problema persiste quando il bottone si disattiva.
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2009, 10:43   #14
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Simone89RN Guarda i messaggi
Si l'avevo visto e ho provato anche questa soluzione, ma niente da fare il problema persiste quando il bottone si disattiva.
setIcon() agisce solo sul pulsante attivato oppure rimane a pulsante disattivato?
Cioè quando lo disattivi l'icona sparisce?

Se non sbaglio l'icona settata con setIcon() rimane anche nello stato disabled, se non ne viene specificata un'altra. Hai provato a sostituire a setDisabledIcon() setIcon, richiamandolo però ovviamente solo nel momento in cui fai setEnabled(false) ?
__________________

Ultima modifica di malocchio : 17-07-2009 alle 13:10. Motivo: dislessia mattutina
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2009, 12:19   #15
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
Quote:
Originariamente inviato da malocchio Guarda i messaggi
setIcon() agisce solo sul pulsante attivato oppure rimane a pulsante disattivato?
Cioè quando lo disattivi l'icona sparisce?

Se non sbaglio l'icona settata con setIcon() rimane anche nello stato disabled, se non ne viene specificata un'altra. Hai provato a sostituire a setSelectedIcon setIcon, richiamandolo però ovviamente solo nel momento in cui fai setEnabled(false) ?
Allora per la prima domanda, l'icona è visibile come dici tu sia nello stato attivo (si vede bene) che nello stato disattivo (si vede trasparente).

La seconda invece non mi è tanto chiara, perchè hai citato un metodo che non ho mai usato finora che è setSelectedIcon(), potresti rispiegarla meglio?
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2009, 13:10   #16
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Simone89RN Guarda i messaggi
Allora per la prima domanda, l'icona è visibile come dici tu sia nello stato attivo (si vede bene) che nello stato disattivo (si vede trasparente).

La seconda invece non mi è tanto chiara, perchè hai citato un metodo che non ho mai usato finora che è setSelectedIcon(), potresti rispiegarla meglio?
Ah scusami, volevo dire setDisabledIcon(), il metodo che hai usato tu!
Edito subito...
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 23:45   #17
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
Ok problema risolto, ora però mi manca da gestire la bandierina che l'utente con il tasto destro del mouse mette perchè crede che in quella casella ci sia la mina.

Mi servirebbe un metodo che all'evento del click del pulsante destro del mouse disattivi il bottone solo per il click del tasto sinistro del mouse ma non per quello destro, il setEnabled credo lo disattivi per qualunque evento giusto?

Esiste un metodo che faccia quello che mi serve oppure mi tocca gestire gli eventi dei pulsanti?
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2009, 00:51   #18
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Simone89RN Guarda i messaggi
Ok problema risolto, ora però mi manca da gestire la bandierina che l'utente con il tasto destro del mouse mette perchè crede che in quella casella ci sia la mina.

Mi servirebbe un metodo che all'evento del click del pulsante destro del mouse disattivi il bottone solo per il click del tasto sinistro del mouse ma non per quello destro, il setEnabled credo lo disattivi per qualunque evento giusto?

Esiste un metodo che faccia quello che mi serve oppure mi tocca gestire gli eventi dei pulsanti?
Non sono perfettamente documentato ma posso dirti con buona sicurezza che te lo devi gestire da te, creando una matrice di flag di stato...
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 22-07-2009, 18:09   #19
Simone89RN
Member
 
Iscritto dal: May 2009
Messaggi: 40
Ok tralasciando l'argomento "bandierine", ora alla mia applicazione manca solo da poter essere salvata e caricata su e da File System. E qui avrei bisogno di chiarimenti sulla classe JFileChooser che uso per trovare il file del gioco nel caso di caricamento e di scriverne il nome nel caso di salvataggio.

Inanzitutto visto che si tratta di salvare un vero e proprio progetto utilizzo la classe ObjectOutputStream in modo da poter serializzare tutte le classi che utilizzo a partire dal mio Frame, ma questa classe nel costruttore richiede un riferimento di tipo OutputStream e per questo uso la classe FileOutputStream per creare il file da passare a ObjectOutputStream.

Parliamo di salvataggio:

Quando vado nel blocco try per creare il mio FileOutputStream gli passo al costruttore:

Codice:
try {
				 f = new FileOutputStream(chooser.getSelectedFile().getName());
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			}
con f che è riferimento di classe FileOutputStream e chooser è un JFileChooser.

Poi nel try di creazione del file ObjectOutputStream quando gli passo come parametro f, tutto va a buon fine senza eccezioni, ma quando vado a vedere se nella cartella che avevo scelto per salvare, non compare nessun file. La mia domanda è questa: il metodo chooser.getSelectedFile().getName() ti da effettivamente il percorso di salvataggio scelto con JFileChooser compreso il nome che l'utente ha scritto per creare il file?
Simone89RN è offline   Rispondi citando il messaggio o parte di esso
Old 22-07-2009, 18:32   #20
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Simone89RN Guarda i messaggi
Ok tralasciando l'argomento "bandierine", ora alla mia applicazione manca solo da poter essere salvata e caricata su e da File System. E qui avrei bisogno di chiarimenti sulla classe JFileChooser che uso per trovare il file del gioco nel caso di caricamento e di scriverne il nome nel caso di salvataggio.

Inanzitutto visto che si tratta di salvare un vero e proprio progetto utilizzo la classe ObjectOutputStream in modo da poter serializzare tutte le classi che utilizzo a partire dal mio Frame, ma questa classe nel costruttore richiede un riferimento di tipo OutputStream e per questo uso la classe FileOutputStream per creare il file da passare a ObjectOutputStream.

Parliamo di salvataggio:

Quando vado nel blocco try per creare il mio FileOutputStream gli passo al costruttore:

Codice:
try {
				 f = new FileOutputStream(chooser.getSelectedFile().getName());
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			}
con f che è riferimento di classe FileOutputStream e chooser è un JFileChooser.

Poi nel try di creazione del file ObjectOutputStream quando gli passo come parametro f, tutto va a buon fine senza eccezioni, ma quando vado a vedere se nella cartella che avevo scelto per salvare, non compare nessun file. La mia domanda è questa: il metodo chooser.getSelectedFile().getName() ti da effettivamente il percorso di salvataggio scelto con JFileChooser compreso il nome che l'utente ha scritto per creare il file?
http://java.sun.com/javase/6/docs/ap....OutputStream)
e
http://java.sun.com/javase/6/docs/ap...a.lang.Object)
e, ovviamente
http://java.sun.com/javase/6/docs/ap...m.html#close()
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
Linus Torvalds durissimo su Elon Musk: '...
Il sogno del metaverso crolla? Zuckerber...
Axiom Space ha completato un importante ...
Gli aeroplani Airbus utilizzeranno i sat...
Una nuova immagine della cometa interste...
'La soluzione a un problema che non esis...
Radeon RX 9000 sì, Ryzen 9000 no:...
Amazon versa 180 milioni al Fisco e canc...
Meta, il Board di Supervisione guarda o...
DJI rivoluziona le consegne aeree: il nu...
Fibercop e Microsoft Italia uniscono per...
App Store Award 2025: scarica le 17 app ...
NVIDIA fa marcia indietro, il supporto P...
Addio definitivo alla GeForce GTX 1080: ...
Numeri record per gli iPhone 17: Apple s...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v