Form visualizzato in modo parziale

di il
4 risposte

Form visualizzato in modo parziale

Buongiorno a tutti del forum,
ho sviluppato un piccolo SW che utilizza il JDesktopPane e i JInternalFrame.

Il tutto funziona solo che quando richiamo il internalFrame esce in modo parziale come nell'img che allego.

Premetto che utilizzo il LookAndFeelInfo "Nimbus" e non so se influisce.

La cosa strana è che come clicco sulla JInternalFrame il form si ricostruisce per intero e risulta completo.

Vorrei capire da cosa dipende.

Grazie per aver letto, ancor di più se mi rispondete.

4 Risposte

  • Re: Form visualizzato in modo parziale

    cnesan ha scritto:


    Il tutto funziona solo che quando richiamo il internalFrame esce in modo parziale come nell'img che allego.

    Premetto che utilizzo il LookAndFeelInfo "Nimbus" e non so se influisce.
    Non so dire ora se possa essere un problema del Nimbus, a naso direi di no ma dovrei verificare. C'è comunque una cosa che forse non sai. Non hai postato il codice che crea il tuo internal frame ma la cosa da sapere è che c'è una sequenza di operazioni ben precisa da fare per visualizzare correttamente l'internal frame. La sequenza è descritta nel tutorial Oracle How to Use Internal Frames. Nel codice che c'è quasi all'inizio, si vede:
        MyInternalFrame frame = new MyInternalFrame();
        frame.setVisible(true);
        desktop.add(frame);
        try {
            frame.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {}
    Prima si rende visibile l'internal frame, poi lo si aggiunge al desktop pane, poi si imposta selected a true.
    Questa sequenza non è fatta a caso, è la sequenza "che funziona". Se hai fatto qualcosa di diverso o non hai fatto tutte quelle operazioni o le hai fatte in ordine differente da quanto mostrato sopra ... beh, è quello quasi sicuramente il problema.

    Quindi: verifica il codice che hai scritto, se non è come mostrato, aggiustalo e rilancia. Se va tutto ok, era effettivamente quello!

    P.S. questa questione è una cosa nota, l'avevo già riscontrata anche io anni fa ...
  • Re: Form visualizzato in modo parziale

    Grazie,
    ho verificato ed è un problema di sequenza delle operazioni effettuate nella classe che definisce la JDesktopFrame e le classi che estendono la JInternalFrame.

    Infatti nel metodo initialize() delle tre classi che estendono JInternalFrame veniva specificato alla fine setvisible(true), quest'ultima istruzione è stata eliminata.

    Per i metodi della classe JManager (il quale richiama i JInternalFrame) richiamava gli InternalForm ponendo setVisible() in anticipo rispetto al frame.getContentPane(), infatti aggiustando come in seguito si è risolto tutto:
    
    	private void initialize() {
    		
    		try {
    		    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
    		    	if ("Nimbus".equals(info.getName())) {
    		    		UIManager.setLookAndFeel(info.getClassName());
    		    		break;
    		    	}
    		    }
    		} catch (Exception e) {
    			
    		}
    
    		frame = new JFrame();
    		frame.setBounds(100, 100, 1000, 595);
    		frame.setTitle(titleApp);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.getContentPane().setLayout(null);
    		....
    		JDesktopPane desktopPane = new JDesktopPane();
    		desktopPane.setBounds(10, 533, 709, -499);
    		frame.getContentPane().add(desktopPane);
    		desktopPane.setLayout(null);		
    		....
    	}
    
    	private void tractionViewer() {
    		TractionViewer tractionViewer;
    		try {
    			tractionViewer = new TractionViewer(this.databasePath, this.databaseName);
    			frame.getContentPane().add(tractionViewer);
    			tractionViewer.setVisible(true);
    		} catch (ClassNotFoundException | SQLException e) {
    			System.out.println("Warning: formTractionViewer() " + e.getMessage());
    		}
    	}
    
    TractionViewer estende la JInternalFrame

    Grazie
    cnesan
  • Re: Form visualizzato in modo parziale

    cnesan ha scritto:


    
    	private void tractionViewer() {
    		TractionViewer tractionViewer;
    		try {
    			tractionViewer = new TractionViewer(this.databasePath, this.databaseName);
    			frame.getContentPane().add(tractionViewer);
    			tractionViewer.setVisible(true);
    		} catch (ClassNotFoundException | SQLException e) {
    			System.out.println("Warning: formTractionViewer() " + e.getMessage());
    		}
    	}
    
    Dal codice che hai postato si evince che gli internal frame (TractionViewer) NON sono contenuti nel JDesktopPane ma direttamente nel content-pane. Questo non va bene. Stai facendo un po' di pasticci ....
  • Re: Form visualizzato in modo parziale

    In effetti ho eliminato la definizione del JDesktopPane e funziona (nel senso che si aprono lo stesso i JInternalFrame!!!!)

    Ora sto andando in confusione. Effettivamente non associo nessun oggetto alla istanza del JDesktopPane.

    Tuttavia ho provato ad aggiungere l'istanza del JInternalFrame (classe jar esterno) nel JDesktopFrame (con il metodo add()) e ho reso visibile ma niente da fare.

    Ci ritornerò, anche se mi sarei aspettato che quello che ho fatto non doveva funzionare, infatti, ora, non capisco quale sia la differenza tra inserire nel frame principale l'oggetto JInternal Frame e inserire l'oggetto nel JDesktopFrame!!

    Le varie classi esterne sono dichiarati come estensione del JInternalFrame e sono indipendenti tra loro come funzionamento e altro, l'unica cosa è che tutti i form devono trovarsi all'interno di un ContentPane per essere visualizzati all'occorrenza anche assieme e anche in più copie (anche se con dati diversi presi dallo stesso database).

    Ci ritornerò (Spero)
Devi accedere o registrarti per scrivere nel forum
4 risposte