Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Swing: finestra agganciate alla finestra madre

    ciao!

    vorrei impostare un "layout" in cui tutte le altre finestre che apro, sono sempre dentro alla finestra madre.

    quindi, quando avvio il programma ho il mio JFrame principale con il menu e il JPanel con una JTable.
    se poi avvio un altro JFrame (ad esempio per aggiungere dei dati), apro una nuova finestra, ma è cmq dentro a quella principale.

    nel caso in cui sia riuscito a spiegarmi bene, che tipo di layout dovrei usare per una cosa del genere??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Si chiama MDI (Multiple Document Interface) e in Java si realizza per mezzo di un JDesktopPane (che sarà aggiunto alla finestra principale) all'interno del quale dovrai aprire non dei JFrame, ma dei JInternalFrame.

    Documentati su queste classi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Si chiama MDI (Multiple Document Interface) e in Java si realizza per mezzo di un JDesktopPane (che sarà aggiunto alla finestra principale) all'interno del quale dovrai aprire non dei JFrame, ma dei JInternalFrame.

    Documentati su queste classi.


    Ciao.
    perfetto grazie!
    mi sono mosso in quella direzione.

    ho però alcuni piccoli problemi.
    in avvio di JFrame, apro un JInternalFrame di "default", e vorrei che fosse già selezionato / con il focus.
    ho provato così, ma non funziona.
    nel senso che appare ma non è selezionato:
    codice:
        private void startInternalFrame(JInternalFrame jif, boolean resizible, boolean closable, boolean maximizable, boolean iconifiable) {
            desktopPane.add(jif);
            jif.setResizable(resizible);
            jif.setClosable(closable);
            jif.setMaximizable(maximizable);
            jif.setIconifiable(iconifiable);
            jif.moveToFront();
            try {
                jif.setSelected(true);
            } catch (PropertyVetoException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
            jif.show();
        }
    sapresti dirmi il perchè??

  4. #4
    Succede anche a me...non ho mai capito il perché.
    Ho usato questo escamotage perché visto che è una maschera per l'inserimento di credenziali almeno in questo modo ottengo il cursore nel field dello username, anche se non sono mai riuscito a capire il problema del focus.(avevo postato qua la stessa problematica tempo fà)

    codice:
            dframe=new DesktopFrame();//classe che estende JDesktopPane
            setContentPane(dframe);
            log=new Login(this);
            dframe.getDesktop().add(log);    
            //forza la richiesta di focus 
            
        log.setVisible(true);
            
            try {
                   log.setSelected( true );
            } catch (java.beans.PropertyVetoException pvex) { 
                   pvex.printStackTrace(); 
            }
            dframe.getDesktopManager().activateFrame( log );
                
             SwingUtilities.invokeLater(new Runnable() {
                  public void run() {
                    log.getTextField().requestFocus();
            
                  }
            });
    Ciao.
    Ultima modifica di schumy2000; 11-12-2015 a 16:41
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    grazie schumy2000, appena posso provo.

    che poi in verità non mi funziona solo su l'internale frame avviato con il jframe genitore.

    perchè invece per quelli avviati successivamente da eventi (menu, bottoni, ecc) non hanno problemi.
    prendono il focus senza rompere!

  6. #6
    Anche per me è così....
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Segnalo che la sequenza corretta dei metodi da usare per aprire un JInternalFrame è quella indicata e mostrata nel tutorial ufficiale:
    https://docs.oracle.com/javase/tutor...rnalframe.html
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    ho messo questo di ordine:
    codice:
        private void startInternalFrame(JInternalFrame jif, boolean resizible, boolean closable, boolean maximizable, boolean iconifiable, boolean maximum) {
            jif.setVisible(true);
            jif.setResizable(resizible);
            jif.setClosable(closable);
            jif.setMaximizable(maximizable);
            jif.setIconifiable(iconifiable);
            desktopPane.add(jif);
            try {
                jif.setMaximum(maximum);
                jif.setSelected(true);
            } catch (PropertyVetoException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
        }
    ma non funzionava lo stesso.

    ho provato a ad aggiungere il JInternalFrame in questo modo (nel costruttore del JFrame):
    codice:
            SwingUtilities.invokeLater(() -> {
                startInternalFrame(jif, true, false, true, true, true);
            });
    cos' funziona.

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.