Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

Interfaccia grafica estrazioni del lotto


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 9 risposta/e

#1
orres21

orres21

    Advanced Member

  • Utente
  • StellaStellaStella
  • 270 Messaggi:
Salve a tutti,

stò cercando di fare un applicazioni multithread che mi simuli l'estrazione del lotto. e precisamente stò utilizzando lo schema del produttore cosumatore per effettuare l'estrazione(produttore) e la visualizzazione (consumatore) del numero estratto.
Ora il mio problema è nel costruire un interfaccia grafica che mi consente di avviare una nuova estrazione per tutte le ruote nazionali.
Devo richiamare il thread producer e conumer per ogni ruota???
come faccio a "scrivere" i risultati del thread consumatore ad esempio su una label??

qualcuno potrebbe darmi una mano??


Grazie :help: :help: :help: :help:



#2
ildiabolico

ildiabolico

    Advanced Member

  • Utente
  • StellaStellaStella
  • 405 Messaggi:
Nel producer generi un numero random e lo metti in una classe Buffer, il consumer lo preleva e lo deve stampareil fatto è che se non ricordo male una JLabel prende nel costruttore un ImageIcon() che è di fatto un immagine con estension .gif, invece di usare una JLabel perchè non usi un JtextField con il setwritable()(non ricordo preciso il nome del metodo ma ci sta uno che ti disabilita la scrittura a suo tempo lo usammo in un contest per gestire l'interfaccia di una cassa quindi controlla che ci sta sicuro) a off? in modo che tu possa solo visualizzare i risultati grazie al tread consumer che va a settare il campo del JtextField la cui modifica tramite click dell'utente è disabilitata grazie all'apposito metodo della classe, ti trovi con il discorso? :drunk:
Rappresentante degli studenti al Consiglio Didattico di Ing. Informatica
Rappresentante degli studenti in Commissione Didattica di Ing. Informatica
Mail >> darioderosa89@gmail.com

#3
orres21

orres21

    Advanced Member

  • Utente
  • StellaStellaStella
  • 270 Messaggi:
Innanzitutto Grazie per aver risposto,il metodo che mi permette di non poter modificare il contenuto di una JTextField è setFocusable(false),ora per scrivere all'interno della JTextField posso utilizzare la setText(String) il problema è come faccio a passare i risultati del thread visto che implementa solo il metodo void run() e quindi non mi restituisce una stringa?? GRAZIE

#4
ildiabolico

ildiabolico

    Advanced Member

  • Utente
  • StellaStellaStella
  • 405 Messaggi:
allora ricapitolando il produttore inserisce il numero casuale nella classe buffer
il consumatore lo preleva e setta il jtext-field giusto?
Ora nn vorrei dire eresie dato che ne esco da una giornata di Teoria dei Segnali, ma la classe del consumatore implementa Runnable il che ti consente di scrivere anche altri metodi, quindi se nn erro potresti comunque farti un metodo che ti restituisce quello che ti serve no?
Rappresentante degli studenti al Consiglio Didattico di Ing. Informatica
Rappresentante degli studenti in Commissione Didattica di Ing. Informatica
Mail >> darioderosa89@gmail.com

#5
orres21

orres21

    Advanced Member

  • Utente
  • StellaStellaStella
  • 270 Messaggi:
Allora, questa è la classe produttore
public class Producer implements Runnable{

private int delay;
private Urna buffer;

public Producer (Urna buffer,int delay ){
this.delay=delay;
this.buffer=buffer;
}
public void run() {
for(int i=0;i<5;i++){
int k = (int) ((Math.random() * 89) +1);
//System.out.println(k);
buffer.add(k);
try {
Thread.sleep(((int)Math.random()*delay*300)+300);
}catch (InterruptedException ex){
ex.getMessage();
}
}
}

}


questa consumatore

public class Consumer implements Runnable{

private int delay;
private Urna buffer;
public int [] resto = new int[5];
public Consumer (Urna buffer,int delay ){
this.delay=delay;
this.buffer=buffer;
}

public void run() {
for(int i=0;i<5;i++){
int info = buffer.remove();
System.out.println(info);
resto[i]=info;
try {
Thread.sleep(delay);
}catch (InterruptedException ex){
ex.getMessage();
}
}
}

public String toString(){
String str = new String();
for(int k=0;k<5;k++)
str = str+ (k+1) + "Estratto : " + resto[k] +"\n";
return str;
}
}
Per poter scrivere sulla JText, ho pensato di fare 1 array metterci i dati "consumati" re-implemetare il metodo toString() e passare la stringa alla setText() per scrivere il risultato... ma il risultato ottenuto non è quello desiderato e cioè :
Essendo questa la classe dell'interfaccia:
import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import javax.swing.*;

public class Gui extends JFrame{
public JButton bottone;
public JTextField jTextField1;
public Gui(){
bottone = new JButton("ESTRAZIONE DEL LOTTO");
jTextField1 = new JTextField();
}
public void init(){
getContentPane().setLayout(new GridLayout());
getContentPane().add(bottone);
getContentPane().add(jTextField1);
jTextField1.setFocusable(false);

bottone.addActionListener ( new java.awt.event.ActionListener () {
public void actionPerformed ( ActionEvent e ) {
Urna u = new Urna(5);
Producer p = new Producer(u,1);
Consumer c = new Consumer(u,1);
Thread t1 = new Thread(p);
Thread t2 = new Thread(c);

t1.start();
t2.start();
jTextField1.setText(c.toString());
}
}) ;
}
}
visto che richiamo il metodo toString sul consumatore il risultato è sempre 0 cioè è come se viene prima stampato il risultato e poi fatto partire il thread...
NON SO PROPRIO COME FARE (SARO' IMBECILLE, MA CMQ NN CI RIESCO)!!!!!
:help: @ildiabolico

ps vado dal dentista spero che con il dolore mi venga qualche illuminazione :cray: :cray: :cray:

#6
ildiabolico

ildiabolico

    Advanced Member

  • Utente
  • StellaStellaStella
  • 405 Messaggi:
prova a richiamare il metodo sul tread t2 invece che su c di fatto il tuo thread non è c ma t2, scusa la risposta approssimativa ma ancora una volta mio malgrado vado terribilmente di fretta xD
Rappresentante degli studenti al Consiglio Didattico di Ing. Informatica
Rappresentante degli studenti in Commissione Didattica di Ing. Informatica
Mail >> darioderosa89@gmail.com

#7
orres21

orres21

    Advanced Member

  • Utente
  • StellaStellaStella
  • 270 Messaggi:
richiamando il metodo toString sul thread, viene invocato il proprio metodo toString (il quale mi stampa il nome,la priorità e il gruppo) e non il metodo che ho ridefinito nella classe Consumer, ovviamente perchè quello viene invocato su oggetti di tipo Consumer...

:help: :help: :help:

#8
ildiabolico

ildiabolico

    Advanced Member

  • Utente
  • StellaStellaStella
  • 405 Messaggi:
Rieccomi prrr nel poco tempo che mi è rimasto in mattinata mi sono messo un secondo a guardare il tuo problema, ti propongo una soluzione funzionante anche se lievemente diversa da quella da te proposta spero ti piaccia :dribble:
Riscrivo tutte le classi così da dare aiuto a chi abbia problemi simili o per chi possa trarne spunti vari ^^

[codice-java:26ykaaow]package lotto;

public class Producer implements Runnable{

private double delay;
private Urna buffer;

public Producer (Urna buffer,double d ){
this.delay=d;
this.buffer=buffer;
}
public void run() {
for(int i=0;i<=5;i++){
int k = (int) ((Math.random() * 89) +1);
buffer.add(k);
try {
Thread.sleep((long) (((int)Math.random()*delay*300)+300));
}catch (InterruptedException ex){
ex.getMessage();
}
}
}

}[/codice-java]

[codice-java:26ykaaow]package lotto;

import java.util.ArrayList;

public class Consumer extends Thread{

private int delay;
private Urna buffer;
private ArrayList resto;
private String numeri_estratti;


public Consumer (Urna buffer,int delay ){
this.delay=delay;
this.buffer=buffer;
resto=new ArrayList();
numeri_estratti=" ";
}

public void run() {
for(int i=0;i<=5;i++){
resto.add(buffer.remove(i));
try {
Thread.sleep(delay);
}catch (InterruptedException ex){
ex.getMessage();
}
}
}
public String getNumeriEstratti(){

for(int k=0;k<=5;k++){
numeri_estratti +=(k+1)+")"+ "Estratto: " + resto.get(k) + "\t";
}
return numeri_estratti;
}
}[/codice-java]

[codice-java:26ykaaow]package lotto;

import java.util.ArrayList;


public class Urna {

private ArrayList t;

public Urna(){
t=new ArrayList();
}

public synchronized void add(int k){
t.add(k);
}
public synchronized Integer remove(int k){
return t.get(k);
}
}[/codice-java]

[codice-java:26ykaaow]package lotto;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Gui{
public JButton b;
public JTextField t;
public JFrame f;

public Gui(){
b = new JButton("ESTRAZIONE DEL LOTTO");
t = new JTextField();
f=new JFrame();
}

public void init(){
f.setSize(600, 300);
f.setLayout(new GridLayout(2,1));
t.setFocusable(false);
b.addActionListener(new MioListener());
f.add(t);
f.add(B);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);

}

public class MioListener implements ActionListener{
public void actionPerformed(ActionEvent e){
Urna u=new Urna();
Producer p=new Producer(u,1);
Consumer c=new Consumer(u,3);
p.run();
c.run();
t.setText(c.getNumeriEstratti());
}
}
}[/codice-java]

[codice-java:26ykaaow]package lotto;

public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Gui g=new Gui();
g.init();
}

}[/codice-java]



Nota:
Dopo tutto lo sproloquio ho preferito seguire diciamo una norma di buona programmazione intesa come leggibilità del codice: Nella classe gui puoi vedere che ho usato quella che viene definita una Inner Class che nn è ne più ne meno che una classe innestata in un altra classe che ha l'ovvio vantaggio di rendere il codice più pulito rispetto a scrivere un intera classe nel metodo AddActionListener del JButton no? :D Inseguito invece di procedere con un Implements Runnable nei due thread produttore e consumatore, ho preferito estendere da Thread dato che non abbiamo problemi di ereditarietà multipla in questo esercizio, con l'ovvio vantaggio di poter usare gli oggetti Consumatore e Produttore con i metodi che scrivo io senza incorrere in Overriding non controllati per così dire ^^; In ultimo ho tolto l' extends da te inserito nella classe Gui dato che praticamente non c'è ne bisogno visto che possiamo usare i componenti di swing importando il pakage e per semplicità ho usato una collection invece dei vettori all'interno della classe Urna e Consumatore, nonchè nella Inner Class Mio Listener (dato che con i vettori i metodi devi scriverteli tu mentre con un ArrayList è tutto già fatto ;) )
L'esercizio può essere esteso a più ruote ovviamente ma mi sono fermato dato che già funzionava ^^ spero di esserti stato d'aiuto Buono Studio :laugh:
Rappresentante degli studenti al Consiglio Didattico di Ing. Informatica
Rappresentante degli studenti in Commissione Didattica di Ing. Informatica
Mail >> darioderosa89@gmail.com

#9
orres21

orres21

    Advanced Member

  • Utente
  • StellaStellaStella
  • 270 Messaggi:
GRAZIE per aver postato la tua soluzione, in modo diverso ovevo risolto anche io.... (ho passato il jTextField al costruttore della classe consumer e da li ho fatto la stampa)... ora il mio problema rimane a:

- Come faccio a chiamare lo stesso thread per le 11 ruote???

#10
ildiabolico

ildiabolico

    Advanced Member

  • Utente
  • StellaStellaStella
  • 405 Messaggi:
se guardi il mio codice per farti un idea, basta che il consume carichi l'array list con 11 elementi ed ogni elemento e la stringa dei sei numeri estratti, in modo tale che richiami un thread solo per 11 risultati ^^ :dance:
Rappresentante degli studenti al Consiglio Didattico di Ing. Informatica
Rappresentante degli studenti in Commissione Didattica di Ing. Informatica
Mail >> darioderosa89@gmail.com




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi