Creare un interfaccia grafica in Java

di il
6 risposte

Creare un interfaccia grafica in Java

Salve,

Volevo chiedere alcune info per quanto riguarda la GUI in Java. In pratica ho creato un piccolo algoritmo che simula una rubrica, da console funziona abbastanza bene, almeno per quello che mi serviva. Ma mi stavo chiedendo se per creare un interfaccia grafica si debba pensare a priori le classi, metodi e il main in questa ottica, oppure c'è da creare un nuovo file che integra la grafica?

Di seguito vi elenco il codice del main e della classe che ho creato.

MAIN
package Agenda;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		boolean stopDoWhile = true;

		Scanner input = new Scanner(System.in);

		Contatti Agenda = new Contatti();

		System.out.println("\t\t\t\t\tBenvenuto nella tua Agenda");

		System.out.println("");
		System.out.println("");

		do {

			System.out.println("1)Aggiungi un nuovo contatto\t" + "2)Visualizza lista contatti\t"
					+ "3)Elimina un contatto\t" + "4)Modifica un contatto");
			String sceltaOpzione = input.nextLine().trim();

			if (sceltaOpzione.equals("1")) {

				Agenda.AddContatto();

			} else if (sceltaOpzione.equals("2")) {

				Agenda.displayListContatti();

			} else if (sceltaOpzione.equals("3")) {

				Agenda.removeContatto();

			} else if (sceltaOpzione.equals("4")) {
				
				Agenda.editContatto();
			}

			System.out.println("");

			System.out.println("Desideri ritornare al menu precendete? Y/N");
			String YN = input.nextLine();

			System.out.println("");

			if (YN.equalsIgnoreCase("Y")) {

				stopDoWhile = true;

			} else if (YN.equalsIgnoreCase("N")) {

				stopDoWhile = false;

				System.out.println("");
				System.out.println("Arrivederci");
			}

		} while (stopDoWhile);

	}

}
CLASSE
package Agenda;

import java.util.regex.*;

import java.util.ArrayList;
import java.util.Scanner;

public class Contatti {

	private String Nome, Cognome, contattoSkype, contattoEmail, Cellulare, Fisso;

	Scanner input = new Scanner(System.in);

	ArrayList<Contatti> Agende = new ArrayList<Contatti>();

	public Contatti() {

	}

	public Contatti(String nome, String cognome, String contattoSkype, String contattoEmail, String Cellulare,
			String Fisso) {

		this.Nome = nome;
		this.Cognome = cognome;
		this.contattoSkype = contattoSkype;
		this.contattoEmail = contattoEmail;
		this.Cellulare = Cellulare;
		this.Fisso = Fisso;

	}

	public String getCellulare() {

		return Cellulare;

	}

	public void setCellulare(String cellulare) {

		Cellulare = cellulare;
	}

	public String getFisso() {
		return Fisso;
	}

	public void setFisso(String fisso) {
		Fisso = fisso;
	}

	public String getNome() {
		return Nome;
	}

	public void setNome(String nome) {
		Nome = nome;
	}

	public String getCognome() {
		return Cognome;
	}

	public void setCognome(String cognome) {
		Cognome = cognome;
	}

	public String getContattoSkype() {
		return contattoSkype;
	}

	public void setContattoSkype(String contattoSkype) {
		this.contattoSkype = contattoSkype;
	}

	public String getContattoEmail() {
		return contattoEmail;
	}

	public void setContattoEmail(String contattoEmail) {
		this.contattoEmail = contattoEmail;
	}

	public void AddContatto() {

		/*
		 * Chiedo all'utente di inserire i dati che andrò a salvare all'interno di un
		 * arraylist che conterrà una nuova instanza della classe Contatti
		 */

		System.out.println("");

		int i;

		do {

			System.out.println("Inserisci il nome del contatto");
			Nome = input.nextLine();

			if (Pattern.matches("^[a-zA-Z]+$", Nome)) {

			}

			else {

				System.out.println("");
				System.out.println("Errore! Il nome deve contenere solo lettere");
				System.out.println("");

			}

			for (i = 0; i < Agende.size(); i++) {

				if (Nome.equalsIgnoreCase(Agende.get(i).getNome())) {

					System.out.println("Questo nome è già presente in agenda");

					do {

						System.out.println("Inserisci il nome del contatto");
						Nome = input.nextLine();

					} while ((Nome.equalsIgnoreCase(Agende.get(i).getNome())));

				}

			}

		} while (!Pattern.matches("^[a-zA-Z]+$", Nome));

		System.out.println("");

		do {

			System.out.println("Inserisci il cognome del contatto");
			Cognome = input.nextLine();

			if ((Pattern.matches("^[a-zA-Z]+$", Cognome))) {

			} else {

				System.out.println("");
				System.out.println("Errore! Il cognome deve contenere solo lettere");
				System.out.println("");

			}

			for (i = 0; i < Agende.size(); i++) {

				if (Cognome.equalsIgnoreCase(Agende.get(i).getCognome())) {

					System.out.println("Questo cognome è già presente in agenda");

					do {

						System.out.println("Inserisci il cognome del contatto");
						Cognome = input.nextLine();

					} while ((Cognome.equalsIgnoreCase(Agende.get(i).getCognome())));

				}

			}

		} while (!(Pattern.matches("^[a-zA-Z]+$", Cognome)));

		System.out.println("");

		do {

			System.out.println("Inserisci il numero di cellulare");
			Cellulare = input.nextLine();

			if ((Pattern.matches("[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]", Cellulare))) {

			} else {

				System.out.println("");
				System.out.println(
						"Errore! Potresti aver inserito meno o più di 10 numeri, oppure hai inserito una lettera");
				System.out.println("");

			}

			for (i = 0; i < Agende.size(); i++) {

				if (Cellulare.equalsIgnoreCase(Agende.get(i).getCellulare())) {

					System.out.println("Questo numero di cellulare è già presente in agenda");

					do {

						System.out.println("Inserisci il numero di cellulare");
						Cellulare = input.nextLine();

					} while ((Cellulare.equalsIgnoreCase(Agende.get(i).getCellulare())));

				}

			}

		} while (!(Pattern.matches("[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]", Cellulare)));

		System.out.println("");

		do {

			System.out.println("Inserisci il numero fisso");
			Fisso = input.nextLine();

			if ((Pattern.matches("[0][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]", Fisso))) {

			} else if ((Pattern.matches("[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]", Fisso))) {

				System.out.println("");

				System.out.println("Il numero telefonico fisso deve inziare con la cifra 0");

				System.out.println("");

			} else {

				System.out.println("");
				System.out.println(
						"Errore! Potresti aver inserito meno o più di 10 numeri, oppure hai inserito una lettera");
				System.out.println("");

			}

			for (i = 0; i < Agende.size(); i++) {

				if (Fisso.equalsIgnoreCase(Agende.get(i).getFisso())) {

					System.out.println("Questo numero fisso è già presente in agenda");

					do {

						System.out.println("Inserisci il numero fisso");
						Fisso = input.nextLine();

					} while ((Fisso.equalsIgnoreCase(Agende.get(i).getFisso())));

				}

			}

		} while (!(Pattern.matches("[0][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]", Fisso)));

		System.out.println("");

		do {

			System.out.println("Inserisci il contatto Skype");
			contattoSkype = input.nextLine();

			if ((Pattern.matches("^[A-Za-z0-9+_.-]+(.+)$", contattoSkype))) {

			}

			for (i = 0; i < Agende.size(); i++) {

				if (contattoSkype.equalsIgnoreCase(Agende.get(i).getContattoSkype())) {

					System.out.println("Questo contatto Skype è già presente in agenda");

					do {

						System.out.println("Inserisci il contatto Skype");
						contattoSkype = input.nextLine();

					} while ((Nome.equalsIgnoreCase(Agende.get(i).getContattoSkype())));

				}

			}

		} while (!(Pattern.matches("^[A-Za-z0-9+_.-]+(.+)$", contattoSkype)));

		System.out.println("");

		do {

			System.out.println("Inserisci il contatto email");
			contattoEmail = input.nextLine();

			if ((Pattern.matches("^[A-Za-z0-9+_.-]+@(.+)[.](.+)$", contattoEmail))) {

			} else {

				System.out.println("Errore! Email non valida");
			}

			for (i = 0; i < Agende.size(); i++) {

				if (contattoEmail.equalsIgnoreCase(Agende.get(i).getContattoEmail())) {

					System.out.println("Questo numero fisso è già presente in agenda");

					do {

						System.out.println("Inserisci il contatto email");
						contattoEmail = input.nextLine();

					} while ((contattoEmail.equalsIgnoreCase(Agende.get(i).getContattoEmail())));

				}

			}

		} while (!(Pattern.matches("^[A-Za-z0-9+_.-]+@(.+)[.](.+)$", contattoEmail)));

		System.out.println("");

		Agende.add(new Contatti(Nome, Cognome, contattoSkype, contattoEmail, Cellulare, Fisso));

		System.out.println("Il contatto è stato aggiunto");

	}

	public void displayListContatti() {

		/*
		 * Questo metodo consente all'utente di poter visualizzare la lista dei contatti
		 * salvati in agenda, il primo controllo si accerta che all'interno della lista
		 * Agende non ci siano elementi, se è vera la condizione stamperà il messaggio
		 * "Non ci sono contatti in agenda", e una selezione nel caso l'utente voglia
		 * ritornare al menu precedente o uscire dal programma.
		 * 
		 * Se invece la lista ha degli elementi al suo interno, verrano mostrati tutti i
		 * contatti esistenti al suo interno, e alla fine della lista un menu che chiede
		 * all'utente se vuole visionare i recapiti di un contatto. Dopo di che chiede
		 * di inserire il nome o cognome del contatto.
		 */
		if (Agende.isEmpty()) {

			System.out.println("Non ci sono contatti in agenda");

		} else {

			System.out.println("");
			System.out.println("\t\t\t\t\tLista contatti in agenda");
			System.out.println("");
			for (int i = 0; i < Agende.size(); i++) {

				System.out.println(i + ")" + "Nome contatto: " + Agende.get(i).getNome() + " |" + " Cognome contatto: "
						+ Agende.get(i).getCognome());
			}

			System.out.println("");
			System.out.println("Desidere visualizzare i recapiti di un contatto? Y/N");
			String dettaglioContatto = input.nextLine();

			if (dettaglioContatto.equalsIgnoreCase("Y")) {

				System.out.println(
						"Inserisci il nome o cognome del contatto il quale desideri visulizzare il dettaglio dei recapiti");
				String NomeCognome = input.nextLine();

				System.out.println("");
				for (int i = 0; i < Agende.size(); i++) {
					if (NomeCognome.equalsIgnoreCase(Agende.get(i).getCognome())
							|| (NomeCognome.equalsIgnoreCase(Agende.get(i).getNome()))) {

						System.out.println(i + ") " + "Contatto Skype: " + Agende.get(i).getContattoSkype() + " |"
								+ " Contatto Email: " + Agende.get(i).getContattoEmail() + " |" + " Cellulare: "
								+ Agende.get(i).getCellulare() + " |" + " Numero fisso:" + Agende.get(i).getFisso());

					}

				}

			}

		}

	}

	public void removeContatto() {

		/*
		 * Questo metodo invece elimina un contatto dalla lista, funziona pressappoco
		 * come il metodo per visionare la lista contatti, con la differenza che dopo
		 * aver ciclato con un form e matchato in contatto da eliminare, richiamo il
		 * metodo remove() ed elimino il contatto dalla lista.
		 */

		System.out.println("");
		System.out.println("Inserisci il nome o il congnome del contatto che vuoi eliminare");
		System.out.println("");

		for (int i = 0; i < Agende.size(); i++) {

			System.out.println(i + ")" + "Nome contatto: " + Agende.get(i).getNome() + " |" + " Cognome contatto: "
					+ Agende.get(i).getCognome());
		}

		System.out.println("");
		String eliminaContatto = input.nextLine();

		for (int i = 0; i < Agende.size(); i++) {

			if (eliminaContatto.equalsIgnoreCase(Agende.get(i).getNome())
					|| eliminaContatto.equalsIgnoreCase(Agende.get(i).getCognome())) {

				Agende.get(i);

				System.out.println("");
				System.out.println("Contatto Eliminato");

			} else if (!eliminaContatto.equalsIgnoreCase(Agende.get(i).getNome())) {

				System.out.println("");
				System.out.println("Il contatto non esiste");
			}
		}
	}

	public void editContatto() {

		String continuaModifica;

		do {

			System.out.println("");
			System.out.println("Inserisci il nome o il congnome del contatto che vuoi modificare");
			System.out.println("");

			for (int i = 0; i < Agende.size(); i++) {

				System.out.println(i + ")" + "Nome contatto: " + Agende.get(i).getNome() + " |" + " Cognome contatto: "
						+ Agende.get(i).getCognome());
			}

			System.out.println("");
			String editContatto = input.nextLine();

			int i;
			for (i = 0; i < Agende.size(); i++) {

				if (editContatto.equalsIgnoreCase(Agende.get(i).getNome())
						|| editContatto.equalsIgnoreCase(Agende.get(i).getCognome())) {

					System.out.println("Quale recapito vuoi modificare?\n"
							+ "Inserisci il nome del tipo: Cellulare, Fisso, Skype, Email.");
					String tipoContatto = input.nextLine();

					if (tipoContatto.equalsIgnoreCase("Cellulare")) {

						System.out.println("Inserisci il nuovo numero di cellulare");
						String Cellulare = input.nextLine();

						Agende.get(i).setCellulare(Cellulare);

					} else if (tipoContatto.equalsIgnoreCase("Fisso")) {

						System.out.println("Inserisci il nuovo numero fisso");
						String Fisso = input.nextLine();

						Agende.get(i).setFisso(Fisso);

					} else if (tipoContatto.equalsIgnoreCase("Skype")) {

						System.out.println("Inserisci il nuovo contatto Skype");
						String Skype = input.nextLine();

						Agende.get(i).setContattoSkype(Skype);

					} else if (tipoContatto.equalsIgnoreCase("Email")) {

						System.out.println("Inserisci il nuovo contatto email");
						String Email = input.nextLine();

						Agende.get(i).setContattoEmail(Email);

					}

					System.out.println("");
					System.out.println("Contatto Modificato");

				}

			}

			System.out.println("Desideri continuare nella modifica dei contatti? Y/N");
			continuaModifica = input.nextLine();

		} while (continuaModifica.equalsIgnoreCase("Y"));
	}

}
Qui invece ho fatto una piccola grafica, una bozza su quello che mi piacerebbe fare, cioè al click sul bottone dovrebbe attivare il metodo correlato.

6 Risposte

  • Re: Creare un interfaccia grafica in Java

    SalvatoreT3 ha scritto:


    Volevo chiedere alcune info per quanto riguarda la GUI in Java. In pratica ho creato un piccolo algoritmo che simula una rubrica, da console funziona abbastanza bene, almeno per quello che mi serviva. Ma mi stavo chiedendo se per creare un interfaccia grafica si debba pensare a priori le classi, metodi e il main in questa ottica, oppure c'è da creare un nuovo file che integra la grafica?
    No, non è così banale. A fronte di una applicazione "console" già fatta NON basta dire "aggiungo solo del codice per grafica". La questione è che i concetti sono radicalmente differenti.

    In una applicazione "console" sei tu che decidi in pratica quando/dove/come chiedere dell'input all'utente. Mentre invece in una applicazione grafica la dinamica è praticamente ribaltata. Non sei tu che decidi esattamente quando l'utente può inserire qualcosa. Questo perché le interfacce grafiche vanno avanti per "eventi". Quindi è con i vari click e azioni che l'utente esegue (quando vuole lui!) che fanno avanzare la interfaccia grafica. Pertanto devi ripensare abbastanza le cose.

    E già che ci sono, ma non voglio sembrare "cattivo", ho visto a grandi linee la tua classe Contatti e ti posso già dire che è parecchio SBAGLIATA:
    - è troppo lunga, fa "troppe" cose, mescola la gestione "logica" dei contatti con la interazione verso l'utente
    - è modellata male, la usi sia per rappresentare 1 contatto, sia per rappresentare l'insieme di N contatti
    - ci sono troppe ripetizioni
    - hai messo nomi di variabili che non seguono le convenzioni standard

    Quindi la prima cosa che dovresti fare è (ri)partire in modo più corretto con la programmazione "ad oggetti".
    Perché con queste premesse non saprei cosa potresti combinare in una applicazione grafica ....
  • Re: Creare un interfaccia grafica in Java

    Grazie per i suggerimenti, in effetti sono alle prime armi con Java e alcune cose inserite sono andato per test. Cosa consigli? perchè ho fatto un corso base è teoricamente credo di conoscere abbastanza, però in pratica forse mi perdo un po. Per quanto riguarda parte logica e interazione utente, intendi creare una classe separata per l'interazione utente? Oppure creare dei metodi che interagiscono con i metodi logici?
  • Re: Creare un interfaccia grafica in Java

    SalvatoreT3 ha scritto:


    Cosa consigli? perchè ho fatto un corso base è teoricamente credo di conoscere abbastanza, però in pratica forse mi perdo un po. Per quanto riguarda parte logica e interazione utente, o creare una classe separata per l'interazione utente? Oppure creare dei metodi che interagiscono con i metodi logici?
    Innanzitutto dovresti pensare a modellare meglio la gestione della agenda. Intendo a livello concettuale/logico. La interazione con l'utente non conta affatto a questo livello. La puoi fare anche successivamente e pure in vari modi.

    Devi gestire una agenda (di contatti). Allora quante/quali classi pensi di aver bisogno? In quali relazioni? Quali operazioni si devono poter fare su una agenda? (es. "aggiungi un contatto")
    Prova a valutare, al limite chiedi x dubbi.
  • Re: Creare un interfaccia grafica in Java

    I requisiti richiesti erano questi:

    L'agenda doveva contenere nome, cognome, cellulare, fisso, email e skype. Gestire un numero illimitato di contatti, e dare la possibilità all'utente di visualizzare la lista dei contatti e la lista in dettaglio dei recapiti di un singolo contatto, poter eliminare un determinato contatto, e poter modificare un determinato recapito di un determinato contatto.

    Quindi avevo pensato che come classe poteva bastare una che gestisse questi 4 metodi: Aggiungere un contatto; Visualizzare lista contatti; Eliminare un contatto; Modificare un contatto.
  • Re: Creare un interfaccia grafica in Java

    SalvatoreT3 ha scritto:


    Quindi avevo pensato che come classe poteva bastare una
    Eh no. Questo infatti è stato lo sbaglio (grosso) iniziale che hai già fatto e che ti ho evidenziato prima (è il secondo punto elencato).
    La classe Contatti che hai scritto modella male le cose. Ogni volta che crei un oggetto Contatti per aggiungerlo al ArrayList, ti porti dietro nell'oggetto un altro ArrayList inutile, perché l'oggetto lo stai usando per modellare 1 contatto. Nel main() invece crei un oggetto Contatti per usarlo come "insieme" di contatti ma non usi i suoi campi nome, cognome, ecc... Ed è proprio questa doppia valenza che è sbagliata e non è nei giusti termini della programmazione ad oggetti.

    Quindi fai:

    1) Una classe Contatto. Ci metti i campi nome, cognome, ecc.... ci metti eventuale/i costruttori, ci metti i getter/setter e altro di utile (es. toString() ).

    2) Una classe Contatti o Agenda o AgendaContatti o Rubrica (nome che vuoi, purché descriva bene il senso di avere N contatti). In questa ci metti il ArrayList e tutti i metodi per gestire in maniera "logica" l'insieme dei contatti.

    In queste due classi la interazione con l'utente non c'entra/conta affatto. Come interagirai con l'utente sarà compito di altre classi, a seconda che sia una applicazione console, GUI o che sia.

    E ricorda di mettere dei nomi appropriati che seguono le convenzioni standard: i nomi di classi/tipi iniziano con la maiuscola. I nomi di variabili e metodi iniziano con la minuscola.

    Non fare cose tipo
    	public void setCognome(String cognome) {
    		Cognome = cognome;     // <--------- NO
    	}
  • Re: Creare un interfaccia grafica in Java

    Grazie, proverò a sistemare, effettivamente proprio male il progetto.
Devi accedere o registrarti per scrivere nel forum
6 risposte