Assegnare numero casuale a dei nomi

« Older   Newer »
 
  Share  
.
  1. RootkitNeo
     
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Ok, avevo un attimo di tempo ed ho acceso l'altro vecchio PC. Ho scritto due righe di codice implementando il tutto.
    E' solo una possibile implementazione, puoi progettarlo anche diversamente.

    Utente.java
    CODICE
    class Utente {
     private String nome;
     private int numero;
     
     Utente(String nome, int numero) {
       this.nome = nome;
       this.numero = numero;
     }
     
     String getNome() {
       return nome;
     }
     int getNumero() {
       return numero;
     }
    }



    GestioneNomi.java
    CODICE
    import java.util.*;

    class GestioneNomi {
     // Memorizzo l'elenco per modellare internamente
     private ArrayList<Utente> elencoUtenti;
     private Random random;
     private final int MAX = 40;
     
     
     GestioneNomi() {
       elencoUtenti = new ArrayList<Utente>();
       random = new Random();
     }
     
     // Restituisce l'ID dell'utente aggiunto
     int aggiungiUtente(String nome) {
       int id = generaNumero();
       elencoUtenti.add(new Utente(nome,id));
       return id;
     }
     
     private int generaNumero() {
       return random.nextInt(MAX) + 1;
     }
    }


    Non penso ci sia nulla da dire su questa classe. Modella semplicemente i dati del software usando un ArrayList.


    Questa classe invece implementa ActionListener e riceve gli eventi. Il suo compito è comunicare con il Model (GestioneNomi in questo caso) e con la grafica (GUI). In pratica non fa altro che ricevere un evento da parte dell'utente (pressione del pulsante), elaborarlo (passandolo al Model) ed ottenendo un risultato. Il risultato lo manda di nuovo alla grafica, così da aggiornare la GUI (inserisce nome e numero nella tabella).

    Controller.java
    CODICE
    import java.awt.*;
    import java.awt.event.*;

    class Controller implements ActionListener {
     private GestioneNomi gn;
     private GUI gui;
     
     Controller(GestioneNomi gn, GUI gui) {
       this.gn = gn;
       this.gui = gui;
       
       gui.init();
       gui.makeComponent();
       gui.aggiungiAscoltatori(this);
     }
     
     public void actionPerformed(ActionEvent ae) {
       // Inutile controllare con un if quale pulsante
       // e' premuto, dato che l'unico registrato e'
       // il bottone di inserimento
       
       String n = gui.getNome();
       int id = gn.aggiungiUtente(n);
       gui.aggiornaTabella(n,id);
       
       // Cancello il campo di testo (e' piu' bello vederlo vuoto :P )
       gui.pulisciCampo();
     }
    }



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

    import java.util.Vector;

    class GUI {
     // Variabili di istanza
     // ----------------------------------
     private JFrame frame;
     private JTextField nome;
     private JButton aggiungi;
     private MyTableModel tableModel;
     private JTable table;
     // ----------------------------------
     
     // Costruttore
     GUI() {

     }
     // Fine costruttore
     
     
     // Ascoltatore del bottone
     // ------------------------------------------------
     void aggiungiAscoltatori(ActionListener al) {
       aggiungi.addActionListener(al);
     }
     // ------------------------------------------------
     
     //  Creo pannelli e componenti
     // ------------------------------------------------
     void makeComponent() {
       JPanel container = new JPanel(new GridLayout(2,1));
       
       JPanel comandi = new JPanel();
       JLabel text = new JLabel("Nome:");
       nome = new JTextField(10);
       aggiungi = new JButton("Aggiungi");
       
       comandi.add(text);
       comandi.add(nome);
       comandi.add(aggiungi);
       
       JPanel tabella = new JPanel(new BorderLayout());
       tableModel = new MyTableModel();
       table = new JTable(tableModel);
       table.getTableHeader().setOpaque(false);
       table.getTableHeader().setBackground(Color.WHITE);
       
       JScrollPane scrollTable = new JScrollPane(table);
       tabella.add(scrollTable);
       tableModel.addColumn("ID");
       tableModel.addColumn("Nome");
       
       
       container.add(comandi);
       container.add(tabella);
       
       
       frame.getContentPane().add(container,BorderLayout.CENTER);
       frame.setSize(400,400);
       frame.setVisible(true);
     }
     // ---------------------------------------------------
     
     
     String getNome() {
       return nome.getText();
     }
     
     // Aggiorna la grafica aggiungendo riga e contenuto
     void aggiornaTabella(String s, int n) {
       Vector<String> row = new Vector<String>();
       row.add(""+n);
       row.add(s);
       tableModel.addRow(row);
     }
     
     void pulisciCampo() {
       nome.setText("");
     }
     
     
     private void makeGUI() {
       frame = new JFrame("Esempio");
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
     
     // Avvio la grafica usando un nuovo thread
     // Nel tutorial della Oracle se non erro c'è tutta la spiegazione
     void init() {
       try {
         SwingUtilities.invokeAndWait(new Runnable() {
           public void run() {
             makeGUI();
           }
         });
       } catch(Exception e) {}
     }
     
     
     // Table Model personalizzato
     private class MyTableModel extends DefaultTableModel {
       MyTableModel() {
         super();
       }

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


    Implementa semplicemente la grafica. Utilizzo un JPanel come contenitore di altri due JPanel. Questo primo contenitore usa una griglia di 2x1 (2 righe ed 1 colonna). Nella prima riga memorizza un JPanel con label, campo di testo e bottone; nella seconda riga invece la tabella. Il panel della prima riga usa il layout di default (FlowLayout) mentre la seconda riga usa Borderlayout per occupare tutto lo spazio con la tabella.


    Main.java
    CODICE
    class Main {
     public static void main(String[] args) {
       GestioneNomi gn = new GestioneNomi();
       GUI gui = new GUI();
       
       Controller c = new Controller(gn,gui);
     }
    }



    Avvia l'applicazione. Passa al controller il model e la grafica; in questo modo si fa carico della loro gestione (fa da tramite).
     
    Top
    .
15 replies since 25/3/2015, 00:02   132 views
  Share  
.