Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128

    [Java] Passaggio parametri da Jframe a Jdialog e viceversa

    Salve dinuovo a tutto il forum, apro una nuova discussione sperando che non sia gia stata trattata e che sia utile.

    Mi sono nuovamente arenato, come gia detto sto imparando l'approccio Java dopo aver utilizzato altri linguaggi non OO putri, quindi confido sulla vostra pazienza e cortesia.

    Come da oggetto devo passare paramentri a una JDialog modale (cosi blocco il JFrame chiamante fino a chiusura dialog) che apro con evento doppio click su una riga di una JTable con tre campi (string, int, string....a tal proposito non mi è chiaro il motivo per cui settare i tipi dei dati della table se poi getValueAt(i, j) sputa object e devo rifare le conversioni di tipo... )
    La dialog (classe istanziata in un file java a parte) contiene un paio di label e alcuni bottoni ( uno il classico annulla a cui dovrei legare evento chiudi dialog e uno conferma che dopo aver fatto cose con altri bottoni (+ e - a incrementare o diminuire la quantita che arriva dalla riga) ripassa i dati al Jframe in particolare la quantita modificata.

    Ho letto un po di cose in rete ma non trovo informazioni sufficienti per gestire la cosa...
    vi chiedo dritte e magari esempi su come sui paramenti in entrambe le direzioni.

    Per i dati in "andata" potrei passare l'evento o meglio la sorgente dell'evento come parametro alla classe e gestirne i dati nel costruttore ma non so se sia il modo corretto, intendo dire:


    codice:
    javax.swing.JTable source = (javax.swing.JTable)evt.getSource();
    int row = source.rowAtPoint(evt.getPoint());
    modQta modifica = new modQta(this, true);                     
    modifica.setLocation(450, 250); modifica.setVisible(true);
    
    public class modQta extends javax.swing.JDialog {
    
        public modQta(java.awt.Frame parent, boolean modal) {
            super(parent, modal);
            initComponents();
    aggiungere source come paramentro passato alla classe oltre al frame e modal true, o magari anche row per avere la riga al ritorno da modificare

    E' il modo corretto?

    grazie come sempre a tutti per la pazienza

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Passaggio parametri da Jframe a Jdialog e viceversa

    Originariamente inviato da Kneos
    a tal proposito non mi è chiaro il motivo per cui settare i tipi dei dati della table se poi getValueAt(i, j) sputa object e devo rifare le conversioni di tipo...
    Il getValueAt serve principalmente a ... JTable o a qualunque altra entità che non è molto interessata al tipo esatto del valore nella cella.
    Certo, puoi invocarlo anche tu ma ovviamente hai in mano un Object che devi "sapere" tu come trattarlo.

    Se però hai fatto un tuo table model specifico, allora dovresti modellare le cose in modo appropriato e fare in modo che il table model esponga una API (interfaccia di programmazione) estesa e più appropriata per il tipo di oggetti che deve gestire.

    Spiego meglio: se fai un table model per gestire una tabella di persone, avresti innanzitutto, presumibilmente, una classe Persona e potresti fare una classe PersoneTableModel (che internamente potrebbe avere un Persona[] o un List<Persona> o altro a seconda delle necessità) e offrire all'esterno ad esempio un metodo:

    Persona getPersonaAtRow(int riga)

    (il nome del metodo lo puoi fare come credi)

    Così getValueAt resta per JTable ma tu hai a disposizione un livello di astrazione maggiore e più appropriato.

    Originariamente inviato da Kneos
    La dialog (classe istanziata in un file java a parte) contiene un paio di label e alcuni bottoni ( uno il classico annulla a cui dovrei legare evento chiudi dialog e uno conferma che dopo aver fatto cose con altri bottoni (+ e - a incrementare o diminuire la quantita che arriva dalla riga) ripassa i dati al Jframe in particolare la quantita modificata.

    Ho letto un po di cose in rete ma non trovo informazioni sufficienti per gestire la cosa...
    vi chiedo dritte e magari esempi su come sui paramenti in entrambe le direzioni.
    Innanzitutto ti conviene ovviamente creare una classe che estende JDialog. Riprendiamo l'esempio della tabella di persone. Potresti avere una dialog PersonaEditDialog.

    Una possibilità è quella di definire un metodo es.:

    Persona editPersona(Persona p);

    Dentro farai:
    - se p è null la dialog è inizialmente vuota, altrimenti imposti i campi con le proprietà di p.
    - invochi setVisible(true);
    - se è stato premuto il pulsante di ok (questo lo sai gestendo un flag che vai a settare quando viene premuto il pulsante di ok) prendi i dati dai campi e crei un oggetto Persona da restituire altrimenti restituisci null

    Questo è solo uno degli scenari possibili.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Ciao andbin, grazie per la rispota, stavolta pero non ti seguo, scusami, colpa mia come sai.
    Allora come hai visto dal codice ho creato la mia classe che estende JDialog (in un nuovo file java):
    codice:
    public class modQta extends javax.swing.JDialog {
          public modQta(java.awt.Frame parent, boolean modal) {
             super(parent, modal);
             initComponents();
    poi la richiamo cosi per farla aprire con gia i componenti piazzati (solo da aggiornare con i valori che ottengo dalla riga), quindi tu mi dici che non devo passare il paramentro riga (ma la riga di una jtable non è gia un array di suo??? questo è il codice che aggiunge una riga alla table mi pare un array o sbaglio: model.addRow(new Object[]{bnEvent.getText(), 1, "€ "+String.format ("%.2f", f)}) alla nuova classe e gestirlo nel costruttorre ma creare un metodo nella classe modqta che chiamo dal jframe nel metodo che gestisce il doppio click sulla riga prima di settare setvisible(true)?
    In effetti non ho trovato un metodo corrispondente al addRow che invece prende il vettore riga della jtable tipo un getRow(row).......

    E poi per il ritorno dei dati al jframe??

  4. #4
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Per i dati in andata vverso la JDialog ho risolto cosi:

    codice:
    javax.swing.JTable source = (javax.swing.JTable)evt.getSource();
    int row = source.rowAtPoint(evt.getPoint());
    String[] riga = new String[3];
    for (int i=0;i<3;i++){
        riga[i]=source.getValueAt(row, i).toString();
     }
     modQta modifica = new modQta(this, true);
    modifica.setLocation(450, 250);
    modifica.setLocationRelativeTo(this);
    modifica.makeModQtaGui(riga);
    modifica.setVisible(true);
    dove makeModQtaGui è un metodo della classe modqta chee estende Jdialog in cui vado a mettere i dati ottenuti nel posto che mi serve.
    Non so se è questo che intendevi andbin e se sia corretto spero di si, non avendo trovato un getRow ho fatto un array riga con i 3 valori della riga cliccata.

    Ora devo fare la stessa cosa in ritorno con i dati modificati ma non so se posso fare qualcosa del tipo parent.miomtd che legge i dati in ritorno e li piazza sulla riga JTable cliccata all'inizio...
    Dove parent è ovviamente la variabile che identifica il Jframe chiamante (il this di modQta(this, true) per intenderci).
    Come identifico il numero riga che ho cliccato all'inizio? cosi come ho fatto la chiamata in andata il valore row me lo perdo costruendo riga[]

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Kneos
    model.addRow(new Object[]{bnEvent.getText(), 1, "€ "+String.format ("%.2f", f)});
    Stai usando DefaultTableModel? Certo, può anche andare bene e offre già di serie addRow/insertRow ecc...
    Ma innanzitutto non ha un metodo per fornirti "la riga" ... nemmeno come Object[] o Vector<Object>. Questo è un suo limite. E comunque tratta tutto a livello di Object.
    Se vuoi qualcosa a livello più alto .... scrivi un tuo table model.

    Originariamente inviato da Kneos
    E poi per il ritorno dei dati al jframe??
    Rifacendo l'esempio di una dialog per i dati di una Persona, uno scenario di codice sarebbe (abbozzato):

    codice:
    public class PersonaEditDialog extends JDialog {
        private boolean ok;
    
        public PersonaEditDialog(Frame parent) {
            super(parent, "Edit Persona", true);    // modale "di serie", non pilotato dall'esterno
            // ... init componenti, layout, ecc....
        }
    
      ....
        public Persona showDialog(Persona p) {
            // se p != null, imposta i campi, altrimenti imposta blank sui campi
            ok = false;
            setVisible(true);
            if (ok) {
                // prendi i valori dei campi e costruisci un Persona
                return nuovaPersona;
            } else {
                return null;
            }
        }
    }
    Nel setup della dialog, creerai un JButton "Ok" e registrerai un ActionListener. Se viene premuto ok, puoi validare l'input (opzionale, se hai dei vincoli), quindi ok=true; e infine dispose();

    Se anche usi DefaultTableModel, nessuno ti vieta di avere una classe che rappresenta la tua entità (es. Persona), semplicemente prendi i dati dal model e popoli l'oggetto.
    Ma invece di un "Persona", nessun ti vieta nemmeno di passare/ricevere dalla dialog un Object[] / Vector<Object>. È più brutto e poco pulito (io lo sconsiglierei) ma fattibile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Forse non hai letto il mio post successivo, che ne pensi della soluzione per passare la riga alla JDialog?? Ho usato un for che riempie un array riga non avendo di default un getRow....funziona perfettamente la chiamata alla classe fatta come ti ho scritto.

    Mi resta i dati in ritorno, cerchero di usare la soluzione che mi hai scritto e poi il numero riga di partenza su cio ho fatto doppio click e che ora devo aggiornare con i nuovi dati ottenuti dal return della tua soluzione.

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Kneos
    Mi resta i dati in ritorno, cerchero di usare la soluzione che mi hai scritto e poi il numero riga di partenza su cio ho fatto doppio click e che ora devo aggiornare con i nuovi dati ottenuti dal return della tua soluzione.
    Allora: o 1) nella classe delle dialog esponi metodi getter per prendere i valori dai campi, oppure 2) cerchi di incapsulare la restituzione di più valori con un unico metodo, oppure 3) come ho fatto l'esempio io, incapsuli proprio tutto compreso il setVisible(true).
    Ma se usi 1) o 2) devi anche esporre qualcosa per dire se è stato confermato o no (se nella tua dialog c'è anche l'opzione per "annullare").
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Si si ora è chiaro, ho risolto il problema e tutto funziona a dovere...devo solo piu creare un array con i dati di ritorno (il nuovaPersona del tuo esempio) ho effettivamente fatto tutto nel metodo della classe dialog e solo la chiamata al metodo con il return dal frame principale.
    ho capito anche perche hai testato il null in ritorno, se invece di premere bottone ok premo bottone annulla o chiudo la dialog con la X da giustemente errore!

    grazie andbin, sei stato perfetto come sempre!

  9. #9
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Ho ancora una piccola domanda immagino stupida riguardante dialog in particolare in questo caso legata ad una confirm dialog:

    ho creato un bottone "chiudi" al quale lego un metodo (evento click) che mi fa comparire la classica finestrella "Vuoi davvero uscire?" con opzioni "Ok" e "annulla" fin qui tutto bene.

    Ora vorrei che la chisura della finestra con la "X" abbia lo stesso comportamento con la confirm dialog cioe richiami il mio metodo, immagino di dover cambiare il comportamento di default:

    codice:
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    che imposta netbeans sul JFrame ma per ora non trovo nulla che faccia al caso

    idee???

    grazie come sempre!

  10. #10
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Invece di EXIT_ON_CLOSE metti DO_NOTHING_ON_CLOSE e aggiungi un WindowListener ridefinendo il metodo windowClosing.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.