Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: Riuso classi GUI

  1. #1

    Riusu classi GUI

    Prima di improntare il progetto grafico della mia applicazione vorrei dei chiarimenti a riguardo.

    Ho un JPanel con dentro molti componenti di input (JTextField, JCombo, JTArea, JRadioBtn, JCheck, ecc.).
    Con lo stesso JPanel vorrei fare due cose:
    1° caso) Jpanel vergine.. ed inserire i dati da mandare poi al DB
    2° caso) visualizzare i dati già inseriti, e caricati da un DB (in questo caso i controlli di input sono di "sola lettura")
    3° caso) visualizzare i dati già inseriti, e caricati da un DB... con la possibilità di poterli modificare... in modo tale da aggiornare il DB

    Potrebbe servirmi d'istanziare più dei suddetti JPanel, ognuno in una TAB di una JTabbed, contemporaneamente...

    Come posso procedere? Come dovrei ragionare nella realizzazione di tale progetto?

    PS. non è un quesito di un esame. Non vi chiedo di farmi un compito. Sono solo un appassionato..

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Hai due possibilità, fondamentalmente, e ti linko una paginetta utilie qui:

    http://docs.oracle.com/javase/tutori...yout/card.html

    una possibilità è quella a cui accennavi tu, ovvero l'uso di un TabbedPane, la seconda quella di scegliere di volta in volta cosa visualizzare (CardLayout)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Andrea, grazie mille per la risposta! Non conoscevo il CardLayout...

    Ma la mia domanda era un'altra (o forse non la riesco a collegare io alla tua risposta).

    Mi chiedevo come posso creare un JPanel che posso istanziare con delle modalità..
    Cioè a volte lo istanzio in modalità di modifica campi, mentre altre volte solo in modalità di lettura, secondo le mie eseigenze.

    Ti faccio un esempio... metti che Tizio ha i permessi per modificare alcuni campi mentre Caio di "sola lettura". Come faccio a far "caricare" in modalità predefinita il JPanel, per la modifica o di sola lettura?
    Metti che devo aprire contemporaneamente 10 JPanel... alcuni modificabili, altri no...

    In pratica io cerco qualcosa del tipo:

    JPanel miopanel = new JPanel();

    If Tizio then miopanel.modificabile = true;
    Else miopanel.modificabile = false;

    ..e nel metodo "modificale" setto tutte le caratteristiche dei componenti di input ("sola lettura" o no)...

    Se poi volessi aprire tanti miopanel, magari caricati in un JTabbed, per gestirne ognuno devo usare una collection di miopanel? O devo fare una mappatura?
    Se sì, mi puoi dare qualche indicazione sui tipi di collection da usare?


  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Quello lo gestisci in base ai permessi del singolo utente. Se si logga X che può modificare, il campo sarà editable, in caso contrario non sarà editable. Però sono cose che non fai sul JPanel (è solo un contenitore) ma sul singolo componente (JButton o JTextField ad esempio). Puoi anche evitare di caricarne alcuni non aggiungendoli al pannello... oppure, puoi avere 2 JPanel e carichi quello che ti serve in base ai permessi dell'utente.

  5. #5
    e questa cosa come si gestisce?! Tramite degli If oppure c'è un meccanismo più efficace?

    Nel senso... dovrei creare il JPanel con dentro tanti componenti di Input... e per ognuno dovrei settare la visibilità o la "sola lettura" in base a degli IF?

    IF permesso = true then JTXT_1.visible = true else ...= false
    IF permesso = true then JTXT_2.visible = true else ...= false
    IF permesso = true then JTXT_3.visible = true else ...= false
    ecc.. ecc..

    Domanda: nel caso di sola lettura non potrei mettere i componenti di input dentro un subpannello che rendo "freeze".. in modo da disabilitare tutti i suoi componenti con una mossa sola?

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Un alternativa è quella, ma se i componenti sono molti esce molto brutto oltre che non molto efficiente.
    Un alternativa che preferisco è la seguente

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    
    class Permesso {
      public static int AMMINISTRAZIONE = 0;
      public static int UTENTE          = 1;
      
      private Permesso() {}
    }
    
    class Utente {
      private int permesso;
      private String nome;
      
      Utente(String nome, int permesso) throws Exception {
        if(permesso != Permesso.AMMINISTRAZIONE && permesso != Permesso.UTENTE) throw new Exception();
    	this.nome     = nome;
    	this.permesso = permesso;
      }
      
      
      int getPermesso() {
        return permesso;
      }
      String getNome() {
        return nome;
      }
    }
    
    class PannelloAdmin extends JPanel {
      
      PannelloAdmin() {
        JLabel label = new JLabel("Amministrazione");
    	add(label);
      }
    }
    
    class PannelloUtente extends JPanel {
      
      PannelloUtente() {
        JLabel label = new JLabel("Utente");
    	add(label);
      }
    }
    
    
    
    class MyFrame extends JFrame {
      private PannelloAdmin pa;
      private PannelloUtente pu;
      
      private JMenuItem esci;
      // Questo dato potresti averlo grazie ad esempio
      // all'immissione di dati in un campo di testo per
      // la convalida dei dati (magari il programma verifica
      // i dati nel DB; in quel caso crei Utente con i dati ed il permesso)
      private Utente utente;
      
      MyFrame() {
        try {
          // In questo caso è l'admin
          utente = new Utente("root",Permesso.AMMINISTRAZIONE);
    	  // In questo utente
    	  //utente = new Utente("utente",Permesso.UTENTE);
    	} catch(Exception e) {e.printStackTrace();}
    	
        JMenuBar menuBar = new JMenuBar();
    	setJMenuBar(menuBar);
    	
    	JMenu file = new JMenu("File");
    	esci = new JMenuItem("Esci");
    	file.add(esci);
    	
    	menuBar.add(file);
    	
    	if(utente.getPermesso() == Permesso.AMMINISTRAZIONE) {
    	  pa = new PannelloAdmin();
    	  getContentPane().add(pa);
    	} else {
    	  pu = new PannelloUtente();
    	  getContentPane().add(pu);
    	}
    	
    	
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
      
      
      public static void makeGUI() {
        MyFrame mf = new MyFrame();
    	mf.setSize(500,500);
    	mf.setVisible(true);
      }
      
      public static void main(String[] args) {
        try {
    	  SwingUtilities.invokeAndWait(new Runnable() {
    	    public void run() {
    		  makeGUI();
    		}
    	  });
    	} catch(Exception e) {}
      }
    }
    Hai i riferimenti ai 2 pannelli, e poi in base ai permessi che ha l'utente, istanzi il pannello corretto.
    Nell'esempio qui sopra, commentando:
    codice:
    utente = new Utente("root",Permesso.AMMINISTRAZIONE);
    
    // Oppure (come di default)
    utente = new Utente("utente",Permesso.UTENTE);
    avrai o un pannello Amministrazione o un Utente.


    Tieni presente che il mio esempio è stato scritto in 15 minuti... proprio per mostrarti l'idea che sta alla base. ^^

    Domanda: nel caso di sola lettura non potrei mettere i componenti di input dentro un subpannello che rendo "freeze".. in modo da disabilitare tutti i suoi componenti con una mossa sola?
    Devi comunque fare "textField.setEditable(false);" su ogni singolo campo di testo, piuttosto che un setEnabled(false); su ogni bottone. La cosa più comoda e semplice credo sia quella mostrata li sopra... al momento non ho altre idee.

  7. #7
    Eccellente Patrick,

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    
    class Permesso {
      public static int AMMINISTRAZIONE = 0;
      public static int UTENTE          = 1;
      
      private Permesso() {}
    }
    
    class Utente {
      private int permesso;
      private String nome;
      
      Utente(String nome, int permesso) throws Exception {
        if(permesso != Permesso.AMMINISTRAZIONE && permesso != Permesso.UTENTE) throw new Exception();
    	this.nome     = nome;
    	this.permesso = permesso;
      }
      
      
      int getPermesso() {
        return permesso;
      }
      String getNome() {
        return nome;
      }
    }
    
    class Pannello extends JPanel {
        
      private JLabel label;
      private JTextField txt;
    
      Pannello(int permesso) {
        label = new JLabel("PANNELLO");
        txt = new JTextField();
        if (permesso == 0) {
              txt.setText("Sei l'admin! Puoi modificarmi");
              txt.setEditable(true);
        }
        else {
            txt.setText("Sei un utente! Puoi solo leggermi");
            txt.setEditable(false);
        } 
        
    	add(label);
            add(txt);
      }
      
    }
    
    
    
    class MyFrame extends JFrame {
      private Pannello pi;
      
      private JMenuItem esci;
      // Questo dato potresti averlo grazie ad esempio
      // all'immissione di dati in un campo di testo per
      // la convalida dei dati (magari il programma verifica
      // i dati nel DB; in quel caso crei Utente con i dati ed il permesso)
      private Utente utente;
      
      MyFrame() {
        try {
          // In questo caso è l'admin
          utente = new Utente("utente",Permesso.UTENTE);
    	  // In questo utente
    	  //utente = new Utente("utente",Permesso.UTENTE);
    	} catch(Exception e) {e.printStackTrace();}
    	
            JMenuBar menuBar = new JMenuBar();
            setJMenuBar(menuBar);
    
            JMenu file = new JMenu("File");
            esci = new JMenuItem("Esci");
            file.add(esci);
    
            menuBar.add(file);
    
            pi = new Pannello(utente.getPermesso());
            getContentPane().add(pi);
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
      
      
      public static void makeGUI() {
        MyFrame mf = new MyFrame();
    	mf.setSize(500,500);
    	mf.setVisible(true);
      }
      
      public static void main(String[] args) {
        try {
    	  SwingUtilities.invokeAndWait(new Runnable() {
    	    public void run() {
    		  makeGUI();
    		}
    	  });
    	} catch(Exception e) {}
      }
    }
    Ho fatto una piccolissima modifica per vedere come operare... In pratica io posso gestire il mio JPanel direttamente alla fonte..

    Ma se volessi aprire più JPanel, per gestirli devo usare le collections? Cioè.. da fuori la JTabbed come faccio a saper quali sono i pannelli "admin" e quali i pannelli "utente"?


    [EDIT] Ho modificato ancora meglio la classe Pannello così...

    codice:
    class Pannello extends JPanel {
        
      private JLabel label;
      private JLabel label2;
      private JTextField txt;
      
      Pannello() {
        label = new JLabel("PANNELLO vuoto");
        
        add(label);
      }
    
      Pannello(Utente u) {
        label = new JLabel("PANNELLO");
        label2 = new JLabel(u.getNome());
        txt = new JTextField();
        if (u.getPermesso() == 0) {
              txt.setText("Puoi modificarmi");
              txt.setEditable(true);
        }
        else {
            txt.setText("Puoi solo leggermi");
            txt.setEditable(false);
        } 
        
        add(label);
        add(label2);
        add(txt);
      }
      
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Puoi usare un identificativo nel pannello, ad esempio un intero (lo setti quando scegli se i campi sono editabili o no). In questo caso chiamando ad esempio un metodo "getPermesso()" sul tuo JPanel, ottieni il permesso di quel pannello. Una cosa più furba, visto che ogni Pannello ha un suo Utente, è quella di chiamare il metodo getPermesso() di Utente.
    codice:
    int getPermesso() {
      return utente.getPermesso();
    }
    Un array list non ti cambierebbe le cose... cioè, avresti si tutti i JPanel, ma non sai a priori quali sono Admin e quali no. Potresti usare una mappa con chiave il Pannello, e con valore Admin o Utente.
    Se spieghi a cosa ti serve conoscere i permessi dei componenti del JPanel, magari troviamo altre soluzioni.

    Un ultima cosa: i pannelli sono solamente 2, giusto? Ma li metti tu a disposizione, o l'utente può aggiungerne?

  9. #9
    Perfetto..

    avevo pensato anch'io ad una cosa del genere.

    Veniamo alla spigazione particolareggiata del quesito:

    Devo creare un gestionale della mia azienda (un laboratorio di analisi cliniche), e nel pannello Accettazione paziente dovrei creare sia il pannello di inserimento dati, sia quello di sola lettura. E per non creare due pannelli distinti (solo per le azioni, visto che sono graficamente identici) vorrei sfruttare la metodologia che mi hai proposto..
    Vorrei quindi con la stessa GUI fare entrambe le due cose: 1) inserimento/modifica dati paziente, 2) solo lettura

    Nel DB, creerei anche una tabella di tutti i dipendenti che hanno i permessi o libero accesso al pannello accettazione, e vorrei registrare in un file di log quali di questi hanno fatto l'inserimento, la modifica, quando, ecc..
    Potrei anche usare un loggin a variabile globale, pubblica, e risolvo la questione, ma forse così è più sofisticato.

    Inoltre...
    nel flusso di accettazione c'è la possibilità che la mia segretaria debba inserire un (nuovo o vecchio) paziente... munito di una o più ricette mediche.
    Io vorrei inserire nel pannello accettazione del paziente un JTabbed di cui con ogni TAB si riferisca alla relativa ricetta inserita (può essere 1 come anche 5 o 6 ricette).
    Se volessi modificare le analisi inserite nella 3a ricetta (3°TAB_Riecette) del Paziente X... come posso risalirci?

    Per intenderci non so se è più facile progettare il tutto tramite le collections oppure se faccio prima in maniera visuale andando a pescare il testo inserito in ogni componente..


  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da perseoclub
    Devo creare un gestionale della mia azienda (un laboratorio di analisi cliniche), e nel pannello Accettazione paziente dovrei creare sia il pannello di inserimento dati, sia quello di sola lettura. E per non creare due pannelli distinti (solo per le azioni, visto che sono graficamente identici) vorrei sfruttare la metodologia che mi hai proposto..
    Vorrei quindi con la stessa GUI fare entrambe le due cose: 1) inserimento/modifica dati paziente, 2) solo lettura
    Ok, dipende ovviamente dal resto delle classi, quelle che svolgono le operazioni insomma. Assumendo che in ogni JPanel personalizzato tu gestisci anche la pressione sui/sul pulsanti/e è bene avere 2 pannelli come abbiamo stabilito sopra.


    Nel DB, creerei anche una tabella di tutti i dipendenti che hanno i permessi o libero accesso al pannello accettazione, e vorrei registrare in un file di log quali di questi hanno fatto l'inserimento, la modifica, quando, ecc..
    Potrei anche usare un loggin a variabile globale, pubblica, e risolvo la questione, ma forse così è più sofisticato.
    Spero tu abbia già predisposto il DB con tutte le tabelle che ti servono. L'utente (dipendente) in questo caso può aver associata una colonna con i rispettivi permessi; oppure, per per fare un lavoro più bello, puoi associare l'id del dipendente al permesso in questione utilizzando una nuova tabella. In pratica avrai la tabella Dipendente con i dati sul dipendente (ad esempio nome, cognome, password e tutto quello che vuoi) ed una tabella Permessi o AssociazionePermessi che prende l'id (che è univoco) del dipendente e lo associ al permesso rw, o r.

    Si, anche avere un report delle azioni mi sembra corretto. Ricordati solo di non ricreare il file ogni volta. lol

    Non mi è chiaro il "loggin a variabile globale e pubblica", ma già che racchiude in sè "pubblica e globale" non mi sembra una buona soluzione.


    Inoltre...
    nel flusso di accettazione c'è la possibilità che la mia segretaria debba inserire un (nuovo o vecchio) paziente... munito di una o più ricette mediche.
    Io vorrei inserire nel pannello accettazione del paziente un JTabbed di cui con ogni TAB si riferisca alla relativa ricetta inserita (può essere 1 come anche 5 o 6 ricette).
    Se volessi modificare le analisi inserite nella 3a ricetta (3°TAB_Riecette) del Paziente X... come posso risalirci?

    Per intenderci non so se è più facile progettare il tutto tramite le collections oppure se faccio prima in maniera visuale andando a pescare il testo inserito in ogni componente..
    Ok, la cosa positiva è che a quanto mi è parso di capire, essendo ricette, saranno tutte uguali. Quindi ognuna avrà i suoi dati, ma i campi sono sempre gli stessi. Se intendi mostrare tutte le ricette del paziente, mi sembra una brutta idea. Quando saranno molte, sarà un mezzo disastro! Se si tratta dell'inserimento delle nuove ricette, allora ci sta.

    Leggendo poi la frase sotto mi sembra proprio il primo caso... quindi se vuoi mostrare le ricette ti consiglio decisamente un altro modo, non un tabbed. Se hai 50 ricette hai 50 schede... la cosa migliore in questo caso è selezionare la ricetta (magari mostrando la data o un altro dato identificativo, anche sottoforma di String) ed alla selezione "compilare" i campi relativi alla ricetta. Questa potrebbe essere una soluzione, ed è la prima che mi viene ora.

    Per chiarire il discorso tab... Quello non è un problema. Ogni pannello del tabbed ha dei campi e dei bottoni (o semplicemente un bottone per il salvataggio). Internamente al pannello ricevi l'evento del bottone premuto, quindi gestisci il salvataggio direttamente da li.
    Ad ogni modo, puoi comunque ottenere l'indice della scheda (tabbed) selezionata.


    PS: aggiungo che sarebbe anche bene separare il codice dalla GUI. Ma dipende da come hai già scritto il tutto...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.