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

    Focus JDesktopPane e JPanel

    Inserisco nel post questa parte di classe (il costruttore).
    La classe è un JFrame nella quale inserisco un JDesktopPane.
    In essa richiamo anche una classe di Login che permette l'accesso al sistema dopo aver inserito utente e password.
    Il mio problema (se possiamo definirlo così) è banale, cioé al caricamento del JDesktopPane e del pannello di Login su quest'ultimo non ho il focus, infatti questo viene dato sempre al JDesktopPane.

    Come posso fare affinché il focus sia sul pannello di Login?

    codice:
    public class FrameLeague extends JFrame implements ActionListener, MouseListener {
    	private static final long serialVersionUID = 1L;
    	private DesktopFrame dframe;
    
            private int OFFSETX=0;
            private int OFFSETY=100;
    
            private int centrafinestraX=350;
            private int centrafinestraY=160;
    	
    	public FrameLeague() {
               super("My Program");
    
               int inset = 0;
               Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
               setBounds(inset, inset, screenSize.width  , screenSize.height );
    	   
               dframe=new DesktopFrame();
                   
               Login log=new Login(this);
               dframe.getDesktop().add(log);
               log.setSize(350,160);
               log.setLocation((screenSize.width-centrafinestraX-OFFSETX)/2, (screenSize.height-centrafinestraY-OFFSETY)/2 );
            
               log.setVisible(true);
            
    
               //Make dragging a little faster but perhaps uglier.
               dframe.getDesktop().setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
    
               addMouseListener(this);
        }
    
        ...........
    }
    Grazie a tutti,
    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

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Subito dopo aver aggiunto il JInternalFrame al JDesktopPane, richiama il metodo "activateFrame()", passandogli l'istanza di JInternalFrame da attivare (ovvero, il tuo Login):


    codice:
    Login log=new Login(this);
    dframe.getDesktop().add(log)
    dframe.getDesktopManager().activateFrame( log );

    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
    Purtroppo non va...ho provato in tutti i santi modi....
    questa finestra non ne vuol sapere di avere il focus, devo necessariamente cliccarci su, il che non è molto user friendly...
    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

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Uhm... credo dipenda dal L&F.
    Questo codice, ad esempio, funziona se l'impostazione del L&F viene fatta (sistema operativo Windows):

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class TestInternalFrames extends JFrame implements ActionListener {
       private class MioFrame extends JInternalFrame {
          private JTextField txt;
          public MioFrame() {
             getContentPane().setLayout( new BorderLayout() );
             txt = new JTextField();
             txt.requestFocusInWindow();
             getContentPane().add(txt, BorderLayout.NORTH);
             setSize(300, 400);
             setLocationRelativeTo( null );
             setTitle("Titolo");
             setDefaultCloseOperation( DISPOSE_ON_CLOSE );
             setClosable( true );
             setVisible( true );
          }
       }
    
       private JDesktopPane desktop;
       private JButton cmdAdd;
    
       public TestInternalFrames() {
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          desktop = new JDesktopPane();
          c.add(desktop, BorderLayout.CENTER);
    
          JPanel jp = new JPanel( new FlowLayout(FlowLayout.CENTER, 1, 20) );
          cmdAdd = new JButton("Nuovo Frame");
          cmdAdd.addActionListener( this );
          jp.add( cmdAdd );
    
          c.add(jp, BorderLayout.SOUTH);
          setTitle("Esempio");
          setSize(1024, 768);
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setLocationRelativeTo( null );
          setVisible( true );
       }
    
       @Override
       public void actionPerformed(ActionEvent ae) {
          MioFrame mf = new MioFrame();
          desktop.add( mf );
          desktop.getDesktopManager().activateFrame( mf );
       }
    
       public static void main(String[] args) {
          try {
             UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
          } catch (Exception e) { /* L&F */ }
          TestInternalFrames tif = new TestInternalFrames();
       }
    }
    Commentando la riga di impostazione del L&F (nel main) e lasciando quindi il L&F di default, il focus non funziona più.

    Mi informo sulla faccenda perchè potrebbe tornarmi utile in futuro sui miei applicativi.

    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

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Allora... JInternalFrame possiede un metodo apposito "setSelected()" che permette, appunto, di impostare la selezione del JInternalFrame.

    Va effettuata all'interno di un blocco try/catch perchè può sollevare un'eccezione.

    E questo metodo funziona sempre (almeno, sia con L&F standard, che L&F di sistema):

    codice:
    // Creo il JInternalFrame
    Login log=new Login(this);
    
    // Lo aggiungo al JDesktopPane
    dframe.getDesktop().add(log)
    
    // Lo seleziono (quindi, diventa attivo e prende il focus)
    try {
       log.setSelected( true );
    } catch (Exception e) { e.printStackTrace(); }
    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

  6. #6
    Ho fatto delle piccole modifiche ma il problema è sempre lo stesso anche con la soluzione da te prospettata...
    qui il codice del main e la prima parte del Frame magari si riesce a cavare il ragno dal buco

    codice:
    public class Main {
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                @SuppressWarnings("static-access")
    		public void run() {
                	
                	      //Create and set up the window.
            	       FrameLeague frame = new FrameLeague();
                                   frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);        		
                    
                          try {
        			    for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            		          if ("Nimbus".equals(info.getName())) {
                			          UIManager.setLookAndFeel(info.getClassName());
                			          SwingUtilities.updateComponentTreeUI(frame);
                   			          break;
            			    }
        			        }
    		        }
                            catch (Exception ve) {
        			// If Nimbus is not available, you can set the GUI to another look and feel.
                                   ve.printStackTrace();
    		        }
                    
                             //Display the window.
            	        frame.setVisible(true);
                    
                   }
           });
        }
    }
    codice:
    public class FrameLeague extends JFrame implements ActionListener, MouseListener {
    	/**
    	 * 
    	 */
    	private Login log;
    	private static final long serialVersionUID = 1L;
    	private DesktopFrame dframe;
    	//private JDesktopPane desktop;
            public final static int OFFSETX=0;
            public final static int OFFSETY=100;
    	private Dimension screenSize;
            	
    	public FrameLeague() {
                    super("My Program");
                    int inset = 0;
                    screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                    setBounds(inset, inset, screenSize.width  , screenSize.height );
    		dframe=new DesktopFrame();
                    setContentPane(dframe);
    		log=new Login(this);
                    dframe.getDesktop().add(log);
                    try {
       			log.setSelected( true );
    		} 
    		catch (java.beans.PropertyVetoException pvex) { 
                            pvex.printStackTrace(); 
                    }
    		dframe.getDesktopManager().activateFrame( log );
    		
    		log.setSize(350,160);
                    log.setLocation((screenSize.width-350-OFFSETX)/2, (screenSize.height-160-OFFSETY)/2 );
    		log.setVisible(true);
    		
    	     
    
                    dframe.getDesktop().setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
    
    		addMouseListener(this);
        }
    
        ......
    
    }

    Magari dando un occhiata di riesce a capire il perché.
    Anche perché fin quando non c'è l'Ok del bottone della finestra di Login il programma nonva avanti, ovviamente partira dal main che farà partire FrameLeague che a sua volta crearà il JDesktopPane farà partire il pannello di Login il tasto ok del pannello richiama un metodo di FrameLeague che fà partire tutto il processo per questo la classe Login ha questa chiamata==> Login log=new Login(this);

    E' una baggianata (ho fatto cose molto più complicate) intanto....
    Speriamo in un vostro colpo di genio
    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
    Registrato dal
    May 2007
    Messaggi
    55
    molto strano, la soluzione di LeleFT dovrebbe funzionare.
    Puoi provare a forzare una richiesta di focus ad esempio dalla label username del pannello (suopponiamo esista log.getUsernameLbl()) da invocare subito dopo il frame è reso visibile:
    codice:
    ...
    log.setVisible(true);
    //forza la richiesta di focus 
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        log.getUsernameLbl().requestFocus();
      }
    });

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Uhm... prova un po' a fare una modifica: prima di chiamare setSelected() sul JInternalFrame, rendilo visibile:

    codice:
    log=new Login(this);
    dframe.getDesktop().add(log);
    log.setSize(350,160);
    log.setLocation((screenSize.width-350-OFFSETX)/2, (screenSize.height-160-OFFSETY)/2 );
    log.setVisible(true);
    try {
       log.setSelected( true );
    } catch (java.beans.PropertyVetoException pvex) { 
       pvex.printStackTrace(); 
    }
    E' un tentativo... vedo che tu vai in cerca del L&F Nimbus (che io non ho), quindi potrebbe anche essere un problema di quel particolare L&F... però un tentativo lo farei: del resto, perchè un componente possa avere lo stato attivo è necessario che sia visibile, quindi non ha senso richiedere lo stato attivo prima del setVisible().


    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

  9. #9
    Ciao Borras,
    Con la tua soluzione inizialmente non succedeva nulla, la situazione rimaneva uguale.
    Ho tolto la AddMouseListener e il focus applicato al JTextField mi ha preso:
    codice:
    SwingUtilities.invokeLater(new Runnable() {
            public void run() {
        		log.getTextField().requestFocus();
        		
      	}
    });
    la mascherà non prende il focus (si nota che non è selezionata)
    ma il campo ha preso il focus ed è possibile scrivervi dentro.
    Il MouseListener mi serviva per una stupidaggine per cui ho potuto eliminarlo.
    Certo sarei contento se la maschera stessa avesse il focus ma meglio di niente.

    Lele avevo già fatto quella prova ma non andava.
    Poi mi sembra strano che non hai il Nimbus, tutte le JDK hanno il L&F Nimbus...


    Grazie.
    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

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da schumy2000
    Lele avevo già fatto quella prova ma non andava.
    Poi mi sembra strano che non hai il Nimbus, tutte le JDK hanno il L&F Nimbus...
    Ah, ok... se è quello di default ok, non mi sono mai interessato al suo nome.

    A me la soluzione del setSelected() funziona con il L&F di default.

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class TestInternalFrames extends JFrame implements ActionListener {
       private class MioFrame extends JInternalFrame {
          private JTextField txt;
          public MioFrame() {
             getContentPane().setLayout( new BorderLayout() );
             txt = new JTextField();
             txt.requestFocusInWindow();
             getContentPane().add(txt, BorderLayout.NORTH);
             setSize(300, 400);
             setLocationRelativeTo( null );
             setTitle("Titolo");
             setDefaultCloseOperation( DISPOSE_ON_CLOSE );
             setClosable( true );
             setVisible( true );
          }
       }
    
       private JDesktopPane desktop;
       private JButton cmdAdd;
    
       public TestInternalFrames() {
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          desktop = new JDesktopPane();
          c.add(desktop, BorderLayout.CENTER);
    
          JPanel jp = new JPanel( new FlowLayout(FlowLayout.CENTER, 1, 20) );
          cmdAdd = new JButton("Nuovo Frame");
          cmdAdd.addActionListener( this );
          jp.add( cmdAdd );
    
          c.add(jp, BorderLayout.SOUTH);
          setTitle("Esempio");
          setSize(1024, 768);
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setLocationRelativeTo( null );
          setVisible( true );
       }
    
       @Override
       public void actionPerformed(ActionEvent ae) {
          MioFrame mf = new MioFrame();
          desktop.add( mf );
          try {
             mf.setSelected( true );
          } catch (Exception e) { e.printStackTrace(); }
       }
    
       public static void main(String[] args) {
          try {
    //         UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
          } catch (Exception e) { }
          TestInternalFrames tif = new TestInternalFrames();
       }
    }
    Ad ogni clic sul pulsante, viene aperto un nuovo JInternalFrame e questo ha lo stato attivo.


    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

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.