PDA

View Full Version : [Java] creare pulsanti


Pingu1084
23-07-2008, 14:21
Ho un problema von java: non riesco a creare i pulsanti. Vorrei poterci scrivere dentro un testo ed associarci delle funzioni create da me (possibilmente usando lo statement if).

banryu79
23-07-2008, 14:28
Suppongo tu stia usando Swing e non solo AWT puro: in tal caso guarda qua (file:///C:/Programmi/Java/jdk1.6.0_05/docs/api/index.html?overview-summary.html), c'è proprio la base per usare i JButton.

Pingu1084
23-07-2008, 15:07
Mi hai dato il link ad un file del pc (che io probabilmente nn ho oppure ho in un'altra dyrectory). Se ti ricordi dove l'hai preso manda il link alla pagina intrnet

banryu79
23-07-2008, 15:11
Uuuups, sorry :doh:
Ecco qua: How to use buttons... (http://java.sun.com/docs/books/tutorial/uiswing/components/button.html) direttamente da The Java Tutorials della Sun.

In particolare per fare questo:

...ed associarci delle funzioni create da me.

se non ho capito male i tuoi intenti credo dovresti crearti una tua classe che estende JButton: in tal modo la tua classe è un JButton a tutti gli effetti con la possibilità poi di definirci dentro dei metodi personalizzati.

Pingu1084
23-07-2008, 15:42
Uuuups, sorry :doh:
Ecco qua: How to use buttons... (http://java.sun.com/docs/books/tutorial/uiswing/components/button.html) direttamente da The Java Tutorials della Sun.

In particolare per fare questo:

se non ho capito male i tuoi intenti credo dovresti crearti una tua classe che estende JButton: in tal modo la tua classe è un JButton a tutti gli effetti con la possibilità poi di definirci dentro dei metodi personalizzati.

Ci sarebbe una spiegazione più niubbesca?

banryu79
23-07-2008, 17:18
tipo una cosa del genere:

public class MyButton extends javax.swing.JButton
{
// a questo punto hai una classe che estendendo JButton è un JButton
// qui dentro aggiungerai le tue variabili
// e i tuoi metodi
}


poi nel codice dove dei usare il tuo bottone personalizzato

public class MyFrame extends javax.swing.JFrame
{
// membri di MyFrame
// bla bla bla...

// metodi di MyFrame
// bla bla bla...

// entry point dell'applicazione
public static void main(String argv[])
{
MyFrame frame = new MyFrame("Titolo della finestra");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSING);
// eccetera eccetera... le solite cose insomma

// costruiamo e aggiungiamo un bottone al frame:
MyButton button1 = new MyButton();
frame.add(button1);

// ...
}
}


L'esempio che ti ho fatto non è un granchè ne fa molto: però se non capisci questo esempio significa che forse stai tentando di fare qualcosa per cui ancora non sei preparato.

Forse è meglio se cerchi di spiegarci:
1] Dove devi mettere il bottone;
2] Che cosa deve fare il bottone.

Inoltre: che strumenti di sviluppo usi? Usi un IDE come NetBeans o Eclipse?

Pingu1084
24-07-2008, 08:14
tipo una cosa del genere:

public class MyButton extends javax.swing.JButton
{
// a questo punto hai una classe che estendendo JButton è un JButton
// qui dentro aggiungerai le tue variabili
// e i tuoi metodi
}


poi nel codice dove dei usare il tuo bottone personalizzato

public class MyFrame extends javax.swing.JFrame
{
// membri di MyFrame
// bla bla bla...

// metodi di MyFrame
// bla bla bla...

// entry point dell'applicazione
public static void main(String argv[])
{
MyFrame frame = new MyFrame("Titolo della finestra");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSING);
// eccetera eccetera... le solite cose insomma

// costruiamo e aggiungiamo un bottone al frame:
MyButton button1 = new MyButton();
frame.add(button1);

// ...
}
}


L'esempio che ti ho fatto non è un granchè ne fa molto: però se non capisci questo esempio significa che forse stai tentando di fare qualcosa per cui ancora non sei preparato.

Forse è meglio se cerchi di spiegarci:
1] Dove devi mettere il bottone;
2] Che cosa deve fare il bottone.

Inoltre: che strumenti di sviluppo usi? Usi un IDE come NetBeans o Eclipse?

In effetti non ci ho capito niente. Io uso Netbeans 6.1

I pulsanti dovrebbero essere 2, e posizionati sotto al testo gia presente (allineati a sinistra).

Nel codice sono gia presenti degli int. Il primo (chiamiamolo number1) viene generato tramite random number con lo statement "Do while" finchè non supera un certo numero (il primo random number che lo compone si chiama num1) . Per l'altro (chiamiamoli num2, num3,num4...) ho generato dieci random number e 9 int, che sono rappresentati il primo dalla somma dei primi due random number, e gli altri dalla somma del precedente + il random number successivo.

Il testo scrive i due numeri e chiede cosa si vuole fare.

Io vorrei che premendo un pulsante si faccia qualcosa del tipo:

if (number1 > 21) {
out.println("Hai vinto!);
} else if (number1 < 21 && num2 > number1) {
// Al posto di num2 ci può essere qualunque numero raggiunto col pulsante successivo
out.println("Hai vinto!");
} else if (number1 < 21 && num2 < number1) {
out.println("Mi spiace, hai perso");
}


Invece premendo l'altro

//Al posto di num3 ci può essere qualsiasi numero successivo a quello gia raggiunto
if (num3 > 21) {
out.println("Mi spiace, hai perso");
} else if (num3 == 21) {
out.println("Hai vinto!");
} else if (num3 < 21) {
//Qui va messa di nuovo la richiesta ed il codice dei pulsanti
}


P.S.
Non riesco a capire come non far partire il programma in console, netbeans in automatico genera tre files, uno in cui va inserito il codice, e gli altri in cui va modificata l'intrfaccia, io modifico quello in cui devo inserire il codice, ma poi mi fa partire quel file in console, e la parte grafica in finestra (su new project ho selezionato java desktop application, perchè se selezionavo java application e basta, mi generava un solo file, ma non riuscivo a fare gli import).

banryu79
24-07-2008, 08:32
Mmm, francamente penso che prima di imbarcarti nell'implementazione del programma (qualsiasi cosa faccia, anche se è semplicissimo) sarebbe meglio se provassi a seguire un tutorial di base per la creazione di una applicazione grafica.

Visto che usi NetBeans, niente di meglio che questo link (in inglese):
The Java Tutorials
Trail: Creating a GUI with JFC/Swing (http://java.sun.com/docs/books/tutorial/uiswing/index.html)

In particolare ti consiglio di leggere i primi due "capitoli" che trovi nella pagina, quelli intitolati:

1 - Getting Started with Swing
2 - Learning Swing with the NetBeans IDE

A quel punto potresti consultare il capitolo:
3 - Using Swing Components
per informazioni più specifiche circa i componenti che usi nel tuo programma (ad esempio il JButton)

Si tratta di dedicare una manciata di ore alla cosa, con calma, in cambio otterresti chiarezza e un buon punto di inizio per continuare a esercitarti, e finire il tuo programma, sospetto, con semplicità.

Pingu1084
24-07-2008, 08:45
Mmm, francamente penso che prima di imbarcarti nell'implementazione del programma (qualsiasi cosa faccia, anche se è semplicissimo) sarebbe meglio se provassi a seguire un tutorial di base per la creazione di una applicazione grafica.

Visto che usi NetBeans, niente di meglio che questo link (in inglese):
The Java Tutorials
Trail: Creating a GUI with JFC/Swing (http://java.sun.com/docs/books/tutorial/uiswing/index.html)

In particolare ti consiglio di leggere i primi due "capitoli" che trovi nella pagina, quelli intitolati:

1 - Getting Started with Swing
2 - Learning Swing with the NetBeans IDE

A quel punto potresti consultare il capitolo:
3 - Using Swing Components
per informazioni più specifiche circa i componenti che usi nel tuo programma (ad esempio il JButton)

Si tratta di dedicare una manciata di ore alla cosa, con calma, in cambio otterresti chiarezza e un buon punto di inizio per continuare a esercitarti, e finire il tuo programma, sospetto, con semplicità.

Grazie, ora la guardo. Finora l'unica cosa che avevo provato a fare era guardare le stringhe di codice sulla guida "Java for dummies" e da solo (quindi senza leggere le spiegazioni), spezzettarle nel modo in cui serviva a me. Ma credo che se voglio passare ad un livello più avanzato, farò meglio a leggere tutta, o comunque per intero i capitoli che leggo, quella guida che hai linkato te.

banryu79
24-07-2008, 11:43
farò meglio a leggere tutta, o comunque per intero i capitoli che leggo, quella guida che hai linkato te.

Ti confermo che anche secondo me questa è un ottima idea ;)
Comunque, sul sito "juva.sun.com" trovi tantissima documentazione: se impari a usarlo bene può aiutarti non poco nella comprensione.

Inoltre, se affronti Java da cmq poco tempo, prova a trovarti un buon manuale sul linguaggio: in questo modo sarai guidato e imparerai più agevolmente.

Due manuali in italiano :
Java Mattone dopo Mattone (http://www.freeonline.org/guide/javalibro_dtml)
Object Oriented && Java 5 (http://www.claudiodesio.com/)

Pingu1084
24-07-2008, 14:20
Ti confermo che anche secondo me questa è un ottima idea ;)
Comunque, sul sito "juva.sun.com" trovi tantissima documentazione: se impari a usarlo bene può aiutarti non poco nella comprensione.

Inoltre, se affronti Java da cmq poco tempo, prova a trovarti un buon manuale sul linguaggio: in questo modo sarai guidato e imparerai più agevolmente.

Due manuali in italiano :
Java Mattone dopo Mattone (http://www.freeonline.org/guide/javalibro_dtml)
Object Oriented && Java 5 (http://www.claudiodesio.com/)

Io avevo gia una guida (in inglese) su java, ma spiegava solo come programmare per la console, una parte mi torna utile comunque, ma devo imparare i codici per l'output.

Pingu1084
24-07-2008, 15:16
Gia che ci sono metto anche il link all'indice completo del tutorial di sun (http://java.sun.com/docs/books/tutorial/reallybigindex.html).

banryu79
24-07-2008, 16:56
Ottima risorsa, già che ci sono includo pure il link diretto alla pagina del Sun Developer Network da dove si può scaricare tutto il tutorial (circa 34 MB)

Java SE Tutorial (https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter;pgid=yYdgaHqkkjVSR0EUPIQsoQ3D0000FctuPR_w;sid=phd79C5V_tp7_GbdA4oz8cHzIirgnuMQ8_W0NTNLO21VSw==)

Pingu1084
25-07-2008, 08:36
Ho guardato un po' quella guida, e sono riuscito a fare i pulsanti.

Poi ho cancellato quell' inutile proggetto, ed ho ripreso col mio proggetto iniziale.

Però non riuscivo più ad usare gli actionlistener. In pratica con questo codice


package prove;

import java.awt.event.ActionListener;

public class Main implements ActionListener {
...
}
public static void main(String[] args) {
...
}


Alla quina riga mi da errore :muro: . Se io guardo cos'è mi viene scritto "prove.Main is not abtract and does not override abstract method actionPerformed(java.awt.event.ActionEvent) in java.awt.event.ActionListener".

Sulle possibili soluzioni trovo solo "Implement all abstract methods" , e se lo clicco mi aggiunge questo codice:


public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}


Che, se non ho capito male, mi disattiva la possibilità di usare l'actionlistener.

banryu79
25-07-2008, 08:51
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}


Che, se non ho capito male, mi disattiva la possibilità di usare l'actionlistener.

Per l'esempio che segue:
Supponiamo che nella classe Main sia definito il tuo JButton da qualche parte, facciamo finta si chiami "myButton".
Supponiamo anche che la classe Main sia il JFrame dell'applicazione

Ora devi:
1] registrare l'ActionListener al tuo bottone

...
JButton myButton = new JButton();
myButton.addActionListener(this);

// passo 'this' come ActionListener del bottone perchè suppongo che siamo
// nella classe Main la quale, estendendo ActionListener, è il Listener per il
// bottone: la classe Main deve quindi implementare il metodo astratto
// public void actionPerformed(ActionEvent e){} dichiarato da ActionListener.
...


2] implementare il metodo actionPerformed(), ovvero l'azione collegata all'attivazione del bottone

public void actionPerformed(ActionEvent e)
{
System.out.println("Bottone premuto!");

// questo fa comparire una finestra di popup:
javax.swing.JOptionPane.showMessageDialog(this, "Bottone premuto!",
"Action del bottone", JOptionPane.INFORMATION_MESSAGE);
}


Ti consiglio di verificare con la documentazione la sezione "How to..." relativa ai Listener e agli Eventi in generale e poi in particolare ActionListener.


Per concludere ti spiego questo:
Sulle possibili soluzioni trovo solo "Implement all abstract methods" , e se lo clicco mi aggiunge questo codice:
Qui è NetBeans che interviene.
Succede che l'IDE si accorge che la tua classe Main sta estendendo la classe ActionListener.
La classe ActionListener è astratta: questo significa che non può essere istanziata (infatti serve solo come meccanismo di estensione da parte di altre classi) e che obbliga la classe che la estende a implementare tutti i suoi metodi astratti.
Ora, la classe ActionListener dichiara solo un unico metodo astratto: "public void actionPerformed(ActionEvent e)".

NetBeans ti da quindi un errore perchè devi implementare tale metodo.

Cliccando sull'icona di aiuto accanto alla riga di codice dove l'IDE ti segnala l'errore compaiono come hai visto sia la causa di quell'errore che la possibile soluzione che l'IDE ti propone e, se vuoi, adotta per te in maniera automatica.
Così facendo ci pensa NetBeans a inserire il codice che implementa "actionPerformed()" però l'IDE non può sapere che azione vuoi eseguire quando viene attivato il bottone: ecco perchè nel corpo del metodo si limita a lanciare una UnsupportedOperationException: per segnalare che l'azione non è ancora supportata.

Sei tu che devi cancellare il lancio di quell'eccezione inserendo il codice che tu vuoi si esegua e che rappresenta l'azione del bottone.

Pingu1084
25-07-2008, 11:54
Grazie ai tuoi consigli ce l'ho quasi fatta :D .

Ma avrei ancora 3 domando (per ora):

1] Si può creare un pulsante che faccia ripartire l'applicazione?

2] Si può creare un pulsante che chiuda l'applicazione?

3] Come si mettono gli Swing Components nello stile di windows (guida java alla pagina Swing Components>Windows Look and Feel (http://java.sun.com/docs/books/tutorial/ui/features/compWin.html))?

banryu79
25-07-2008, 12:22
1] Si può creare un pulsante che faccia ripartire l'applicazione?

Che cosa intendi di preciso con "faccia ripartire l'applicazione"?
Non penso che tu voglia chiuderla del tutto (ovvero terminare il processo) e poi rilanciarlo.
Suppongo tu voglia solamente reinizializzare dei dati e alcuni componenti grafici, è così?
Se la mia ipotesi è corretta quello che devi fare è definire l'action del bottone in modo opportuno, il che implica chiamare del codice che faccia il lavoro che ho descritto.
Reinizializzare le strutture dati dovrebbe essere semplice, dipende come sono definite e come vengono usate.
Reinizializzare i componenti grafici è possibile, ma qui ti occorrono maggiori conoscenze dei vari componenti che usi e del modo in cui funziona Swing.


2] Si può creare un pulsante che chiuda l'applicazione?

Certo.
E' sufficente inserire nel corpo del metodo actionPerformed() del suo ActionListener una cosa del tipo:

// facciamo finta che "myFrame" sia una reference del JFrame della tua
// applicazione
// chimando dispose() si rilasciano le risorse native usate da questo
// componente e da tutti i suoi sotto componenti.
myFrame.dispose();

// questa chiamata termina la Virtual Machine corrente.
System.exit(0);



3] Come si mettono gli Swing Components nello stile di windows ?

Supponiamo di trovarci nella tua classe principale, quella che estende il JFrame che usi come finestra principale nella tua applicazione.

Facciamo anche finta che questa classe sia la classe Main, e che basti chiamare il suo costruttore per inizializzare tutte le componenti grafiche.

Normalmente per avviare l'applicazione si fa una cosa del tipo:

public static void main(String[] argv)
{
Main main = new Main();
main.setVisible(true);
}


Questo però non è il modo migliore di avviare un'applicazione Swing: si dovrebbe tenere conto delle problematiche relative ai Thread in ambiente Swing e lanciare l'applicazione così (lascio a te approfondire la cosa, per il momento prendi per buona la mia affermazione):

public static void main(String[] argv)
{
java.awt.EventQueue.invokeLater(
new Runnable()
{
public void run()
{
Main main = new Main();
main.setVisible(true);
}
}
);
}



In entrambi i casi, è possibile settare il Look&Feel dell'applicazione grafica in modo che Swing venga eseguito, per esempio, con il Look&Feel del sistema operativo su cui sta girando (ci sono anche altre opzioni per simulare il Look&Feel di un sistema operativo diverso da quello su cui ci si trova o adirittura usare Look&Feel non di sistema, in rete ce ne sono tanti di vario tipo).

Basta dire a Swing che si vuole usare il Look&Feel di sistema (e non quello orrido di default :D), così:

public static void main(String[] argv)
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e)
{
System.err.println( "Errore di creazione Look&Feel" );
}


java.awt.EventQueue.invokeLater(
new Runnable()
{
public void run()
{
Main main = new Main();
main.setVisible(true);
}
}
);
}


In ogni caso ti consiglio di approfondire ogni questione, con calma, dedicandoci il giusto tempo.
Ciao :)

ndakota
25-07-2008, 16:11
Basta dire a Swing che si vuole usare il Look&Feel di sistema (e non quello orrido di default :D), così: cut


grande banryu non sapevo si potesse usare il look&feel di sistema sei il mio idolo :ave: :ave:

banryu79
25-07-2008, 16:26
grande banryu non sapevo si potesse usare il look&feel di sistema sei il mio idolo :ave: :ave:

Non esageriamo, proprio in questi giorni mi sto rendendo conto di quanto poco sappia di programmazione, e di quanta strada si debba fare per arrivare alla forma mentis adatta(o migliore, qualunque essa sia :D ).

Altro che idolo, io personalmente mi sento una caccoletta. :fagiano:

[Comunque felice di poter aiutare chi inizia]