Assegnare numero casuale a dei nomi

« Older   Newer »
 
  Share  
.
  1. Samus89
     
    .

    User deleted


    Ciao a tutti ;)
    Dovrei realizzare un'applicazione molto semplice, devo assegnare a ogni nome inserito in input un numero casuale da 1 a 40 (sono ammesse ripetizioni), come potrei realizzarlo?
    Pensavo di utilizzare le interfacce grafiche di netbeans con un textfield in cui inserire i nomi e due bottoni uno per chiudere e uno per chiedere un altro nome e alla fine restituire in output una text area con tutti i nomi associati a questi numeri casuali.
    Potreste darmi una mano? C' è un metodo più semplice per fare questa cosa?
     
    Top
    .
  2.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    La GUI è l'ultima a cosa a cui pensare.

    Sfortunatamente su questa macchina non ho un compilatore Java al momento, quindi l'unica cosa che posso fare è scrivere due righe senza testarle...

    La modellazione è molto semplice (vi sono un sacco di strade), ti consiglio di creare una classe Utente o Persona con i campi all'interno, in questo caso il nome inserito ed il numero casuale a cui lo associ. Poi utilizzare un'array list per memorizzare tutte le Persone/Utente inseriti.
    Se conosci il limite massimo di persone, puoi anche usare altre strutture (anche un semplice array).


    CODICE
    class Persona {
     private String nome;
     private int numero;

     Persona(int numero, String nome) {
       this.numero = numero;
       this.nome = nome;
     }

     // getter e setter per prendere ed eventualmente settare un nuovo valore
     // .....
    }


    Poi la classe per gestire gli inserimenti, ad esempio
    CODICE
    import java.util.ArrayList;


    class Elenco {
     private ArrayList<Persona> elencoNomi;

     Elenco() {
       elencoNomi = new ArrayList<Persona>();
     }

     void aggiungiPersona(String nome, int numero) {
       elencoNomi.add(new Persona(numero,nome));
     }
     /*
     void aggiungiPersona(Persona p) {
       elencoNomi.add(p);
     }
     */
    }



    Puoi sbizzarrirti... :P
    Puoi anche cambiare l'implementazione della classe qui sopra, e passare solo il nome, lasciando ad Elenco la generazione del numero, tipo:
    CODICE
    import java.util.ArrayList;


    class Elenco {
     private ArrayList<Persona> elencoNomi;

     Elenco() {
       elencoNomi = new ArrayList<Persona>();
     }

     void aggiungiPersona(String nome) {
       Random r = new Random();

       int numero = r.nextInt(40) + 1;
       elencoNomi.add(new Persona(numero,nome));
     }

    }


    Per la grafica puoi rendere tutto molto semplice: classe che estende JFrame, al suo interno crei poi il pannello con JTextField ed i JButton. Puoi mostrare il risultato creando un altro pannello, o magari rendendo visibile la JTextArea sotto a questi componenti terminata l'immissione.

    Spero di averti dato qualche idea.
    Se hai domande... ;)
     
    Top
    .
  3. Samus89
     
    .

    User deleted


    Grazie mille, ora sto provando a realizzarlo per vedere cosa mi esce fuori, per scegliere un numero all'interno di un'intervallo posso utilizzare questa funzione?
    function randNum(min, max) {
    int m=min;
    int n=max;
    int r=m+Math.round(Math.Random()*n);
    return(r);
    Non so bene come realizzare questa parte e in quale classe inserirla
     
    Top
    .
  4.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Te l'ho scritto li sopra il codice per la generazione del numero ed il modo in cui puoi gestire le classi. :P
    Questo ti da già il range:
    CODICE
    int numero = r.nextInt(40) + 1;


    da 1 a 40 (grazie al +1, altrimenti sarebbe 0-39).

    Devi solo usare il codice che c'è li sopra... ad occhio non dovrebbe darti errori in fase di compilazione, ma avendolo scritto qui nel form, non posso garantire. Aggiungi poi i metodi getter/setter a Persona.
     
    Top
    .
  5. Samus89
     
    .

    User deleted


    Hai ragione scusa, mi ero persa un passaggio, ho scritto così allora:
    CODICE
    package roulette;

    import java.util.*;

    public class InserimentoElementi {
       private ArrayList<Utente> elenco_nomi;
       
       public InserimentoElementi() {
           elenco_nomi=new ArrayList<Utente>();
       }
       
    public void aggiungiPersona(String nome) {
      Random r = new Random();

      int numerocasuale = r.nextInt(40) + 1;
      elenco_nomi.add(new Utente(nome,numerocasuale));
    }
       
       
       
    }


    e poi


    CODICE
    package roulette;

    public class Utente {
       private String nome;
       private int numerocasuale;
       
       public Utente(String n, int num) {
           nome=n;
           numerocasuale=num;
       }
    public void setNome(String n) {
       nome=n;
    }
    public String getNome() {
       return nome;
    }
    public void setNumero(int num) {
       numerocasuale=num;
    }
    public int getNumero() {
       return numerocasuale;
    }
       
    }

    Non mi dà errori, adesso dovrei occuparmi dell'interfaccia e del main giusto?
    Per ottenere la stampa dell'array ottenuto devo utilizzare una semplice stampa?
     
    Top
    .
  6.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Si esatto :) Verifica stampando a video il valore che viene generato, così sei certa sia corretto (creando un Main di test).

    Il main puoi racchiuderlo nella classe della grafica. Puoi fare così (come ieri, non posso compilare):

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

    // Implementa ActionListener se gestisci in questa classe i bottoni
    class Main extends JFrame {
     // Variabili di istanza
     // JTextField, JButton,...
     // JPanel pannello componenti

     Main() {
       super("Titolo Applicazione");

       // crei gli oggetti grafici...

     }

     public static void makeGUI() {
       Main m = new Main();
       m.setSize(400,500);
       m.setVisible(true);
     }

     public static void main(String[] args) {
       try {
         SwingUtilities.invokeAndWait(new Runnable() {
           public void run() {
             makeGUI();
          }
        });
      } catch(Exception e)  {}
     }
    }


    Credo sia corretto.
     
    Top
    .
  7. lumo
     
    .

    User deleted


    RootkitNeo: eh ma non vale tutto questo aiuto :D
     
    Top
    .
  8. Samus89
     
    .

    User deleted


    Tranquillo tanto sono un disastro di mio e non ci riesco comunque :D (e forse non dovrei ridere dopo un'affermazione del genere).
    Comunque grazie mille, ho realizzato l'interfaccia grafica, ho creato il textfield e i 2 bottoni, ma non dovrei creare anche un metodo actionPerformed(ActionEvent ev) per far si che una volta premuto ok mi venga restituita la lista di persone e nel caso di continua inserire un altro nome?
     
    Top
    .
  9.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    @lumo: ehh... ;)

    @Samus89:
    Certo, infatti come commento ho scritto
    CODICE
    // Implementa ActionListener se gestisci in questa classe i bottoni
    class Main extends JFrame {


    puoi scegliere tu dove gestirli, ed in base a questo implementi l'interfaccia.
    Quel metodo verrà eseguito ad ogni pressione di un bottone (sempre che non assegni listeners diversi ad ogni bottone). Quindi devi verificare quale bottone è stato premuto.

    Io lo renderei più semplice e più "flessibile". Due bottoni, uno che inserisce l'Utente, ed un altro cliccabile in qualsiasi momento che mostra la lista.
     
    Top
    .
  10. Samus89
     
    .

    User deleted


    Su quella parte ci sto scapocciando un po', per il risultato mi converrebbe creare un metodo per popolare la tabella (JTable) con nome e numero casuale o posso utilizzare un banale showMessageDialog? Intanto incollo quest'ultima parte per capire se sto totalmente sbagliando approccio:

    CODICE
    public void actionPerformed(ActionEvent ev) {
               String command = ev.getActionCommand();
               JLabel tabella=new JLabel("nome"+utente.getNome()+"numero"+utente.getNumero());
               JPanel info = new JPanel();
               info.add(tabella);
               if (command.equals("Fine"))
               
               else {

               }

           }


    Ho considerato 2 pulsanti, uno per il comando Fine che dovrebbe poi stampare il risultato e uno per inserire un altro nome
     
    Top
    .
  11.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Per la JTable o meno tutto dipende da come li vuoi mostrare e da quanti sono anche. La JOptionPane.showMessageDialog è utilizzata appunto per dare un informazione, di solito non è il modo migliore per mostrare dei dati (anzi, non lo è mai).

    L'approccio non è tuttalmente errato, tuttavia non è nemmeno corretto. Il controllo va prima di tutto all'inizio, dato che non sai a priori quale è stato premuto (se prima non controlli, appunto).
    Inoltre in questo modo crei un nuovo JPanel per ogni nome inserito, e non va bene, dato che è più logico un pannello con i componenti (e poi aggiungendoli in quel modo, un pannello andrebbe a sovrapporsi al precedente).

    Se hai un buon numero di Nomi, o pensi di averne un buon numero, sarebbe meglio pensare ad una JTable o mostrarli in altri modi (ma il più semplice credo sia una JTable). Puoi anche usare JLabel, uno per ogni nome, ma il JPanel dovrà utilizzare un tipo di layout differente..
    Per semplicità tuttavia continuerei a pensare ad una JTable. ;)
    Se sei in difficoltà puoi dare un occhio anche ad un mio vecchio articolo: https://solopc.forumcommunity.net/?t=52494860
     
    Top
    .
  12. Samus89
     
    .

    User deleted


    Grazie mille per il link, davvero utile e chiaro, allora ho creato la JTable ma come posso popolarla per ogni inserimento dovuto al click sul bottone "Continua"?
    (lo so che sono un caso perso perdonami :P )
     
    Top
    .
  13.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Figurati ;)

    La soluzione migliore è utilizzare il model che hai creato per la tabella (o utilizzare quello di default se non l'hai creato).

    Sempre per il problema del compilatore e del PC (ho malfunzionamenti...), ti linko questo: www.java2s.com/Tutorial/Java/0240__Swing/Settablevalue.htm
    Qui crea un suo model, ma puoi usare quello di default.

    Qui ad ogni modo trovi il tutorial ufficiale: https://docs.oracle.com/javase/tutorial/ui...ents/table.html

    Nel tuo caso sarebbe meglio creare un table model. Puoi essere poco fine, dato che si tratta di un esercizio a quanto ho capito, ed estendere DefaultTableModel, ridefinendo il metodo incaricato alla modifica delle celle (isCellEditable()); se fai tornare 'false', le celle non possono essere modificate. http://docs.oracle.com/javase/7/docs/api/j...TableModel.html

    Il tuo model sarà quindi qualcosa tipo:

    CODICE
    class MyModel extends DefaultTableModel {
     MyModel() {
       super();
     }

     @Override
     public boolean isCellEditable(int r, int c) {
       return false;
     }
    }


    Nel codice che crea la tabella farai:
    CODICE
    MyModel model;
    JTable table;

    // .....

    model = new MyModel();
    table = new JTable(model);


    In questo modo non dovrai implementare tutti i metodi, ma solo fare l'override di questo (se estendi AbstractTableModel dovrai ridefinirne una buona parte come nel tutorial e come forse faccio io, non ricordo).


    Per aggiungere del contenuto dovrai creare un Vector di stringhe (suppongo sia tutto testo il contenuto), e poi lo passerai al metodo preposto del model, addRow (la classe l'ho linkata ad inizio post).
    L'inserimento di una riga è molto semplice. Al click del bottone ottieni i dati da inserire (Nome e numero), e crei la riga "al volo" inserendola nella tabella, utilizzando il model. Quindi una cosa come:
    CODICE
    String nome = // ottieni nome;
    int numero = // ottieni numero;

    Vector<String> row = new Vector<String>();
    row.add(nome);
    row.add(""+numero);

    model.addRow(row);
     
    Top
    .
  14. Samus89
     
    .

    User deleted


    Ho creato questa parte di programma :

    CODICE
    package provagui;

    import java.util.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    import javax.swing.table.*;


    public class ProvaGUI extends JFrame implements ActionListener {
       
       private Utente utente;
       private InserimentoElementi elem;
       
       private static final String titolo = "Associa nomi";
       
       
       
       private static final JPanel centropnl =  new JPanel();
       private static final JTextField text = new JTextField(20);
       
       
       private static final JPanel sudpnl = new JPanel();
       private static final JButton fineBtn = new JButton("Fine");
       private static final JButton continuaBtn = new JButton("Continua");
       
       public ProvaGUI() {
           
           super(titolo);
           
           
           centropnl.add(text);
           
           sudpnl.add(fineBtn);
           sudpnl.add(continuaBtn);
           
           
           this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           Container frmContentPane = this.getContentPane();
           frmContentPane.setLayout(new BorderLayout());
           frmContentPane.add(centropnl, BorderLayout.CENTER);
           frmContentPane.add(sudpnl, BorderLayout.SOUTH);
           fineBtn.addActionListener(this);
           fineBtn.setActionCommand("Fine");
           continuaBtn.addActionListener(this);
           continuaBtn.setActionCommand("Altro nome");
           
           setSize (500,100);
           setVisible(true);
       }
       
       
               


     
       public static void main(String[] args) {
           ProvaGUI myframe = new ProvaGUI();
           
       }
       
       
               private JTable popolaTabellaNomi(Set<Utente> linkUtente) {
                   String[][] tabella = new String[linkUtente.size()][2];
                   int riga = 0;
                   tabella[riga][0] = utente.getNome();
                   tabella[riga++][1] = utente.getNumero();
                   
                   String[] intestazioni = { "Nome", "Numero"};
                   
                   MyTableModel model = new MyTableModel(tabella, intestazioni);
                   
                   JTable table = new JTable(model);
                   table.setAutoCreateRowSorter(true);
                   return table;
           }
       
       
       public void actionPerformed(ActionEvent ev) {
           String command = ev.getActionCommand();
           if (command.equals("Fine")) {
               
           }
               
           else {

                 
       }            
               
       }
       
               // Table Model
           class MyTableModel extends DefaultTableModel {

                   public MyTableModel(Object[][] data, Object[] columnNames) {
                           super(data, columnNames);
                   }


                   public Class<?> getColumnClass(int c) {
                           return getValueAt(0, c).getClass();
                   }


                   public boolean isCellEditable(int row, int col) {
                           return false;
                   }

           }
       
    }


    Potrebbe andare bene come inizio?
    Purtroppo però ovviamente non posso creare un array di stringhe perché altrimenti ho un'incompatibilità con int
    E un'altra domanda, come imposto la visualizzazione della tabella sull'actonPerformed?
     
    Top
    .
  15.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Voglio precisare che come progettazione, in teoria, non sarebbe del tutto corretta. Sarebbe bene separare la logica dalla grafica. Ma dato che questo è una sorta di esercizio...

    Se i dati li vuoi mostrare tutti in una volta sola puoi risparmiarti anche il model. Io pensavo volessi aggiungere i dati uno alla volta, così da mostrarli direttamente nella tabella.
    Se vuoi fare tutto alla fine, puoi passare a JTable una matrice ed un vettore (oppure un vector di vector ed un vector), guarda i costruttori che mette a disposizione: http://docs.oracle.com/javase/7/docs/api/j...ing/JTable.html

    Il metodo che popola la tabella restituisce un tipo di dato differente da quanto dichiarato. Tu fai restituire una JTable, ma in realtà restituisci un boolean. Inoltre non avrebbe senso dato che in ogni caso restituirebbe true. Quindi puoi lasciarli tranquillamente void.

    La variabile "riga" non serve se la usi in quel modo, puoi usare valori immediati come per le colonne.

    Tuttavia appunto, se vuoi aggiungere tutto assieme, allora dovrai memorizzare tutti gli Utenti inseriti e poi creare una matrice con i numeri generati ed i nomi degli utenti da passare insieme ai nomi delle colonne nella JTable.

    Se il metodo che popola la tabella viene chiamato più volte accade un macello ora come ora. lol Inoltre non aggiungi nemmeno la JTable al frame (o meglio, prima ancora al pannello).

    Se domani riesco ad usare l'altra macchina ti scrivo due righe, salvo imprevisti di qualsiasi tipo.
     
    Top
    .
15 replies since 25/3/2015, 00:02   132 views
  Share  
.