Problema visualizzazione di JInternalFrame su JDesktopPane

di il
2 risposte

Problema visualizzazione di JInternalFrame su JDesktopPane

Buongiorno a tutti, sono nuovo del forum e del linguaggio Java... per cercare di imparare mi dedico ad un po' di prove, ma ho trovato diverse difficoltà con le interfacce grafiche. E' il primo linguaggio ad oggetti che affronto, quindi capirete che alcuni concetti non mi siano proprio immediati.
Il problema è questo: voglio un JInternalFrame (che conterrà un JMenù) su di un JDesktopPane (che funge da background, con immagine). Visualizzo lo sfondo, ma il JInternalFrame viene inesorabilmente visualizzato "dietro" o "sotto" il background... esiste (in quanto se lo clicco con il mouse lo posso trascinare, vedendo ovviamente un pezzo di sfondo che si muove) ma non si vede. Ho provato diverse soluzioni ed ho letto quanto ho trovato in rete, ma evidentemente, sbaglio qualcosa o non vedo chiaramente dove sia il problema.
il codice è questo:

// vari import...

public class backg extends JPanel
{
	static boolean resizable = false;
	static boolean closeable = false;
	static boolean maximizable = false;
	static boolean iconifiable = false;

        private static JInternalFrame Internalframemenu() 
	{
			
	  String title = "Menù"; 
          JInternalFrame internalframemenu = new JInternalFrame(title, resizable,     closeable, maximizable, iconifiable);
		  
          return internalframemenu;	    
	}

        private static void GUI () throws PropertyVetoException 
	{	
           JFrame frame = new JFrame("prova");
	   frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
           frame.setDefaultCloseOperation(JInternalFrame.EXIT_ON_CLOSE);
	   frame.repaint();
		    
	   JDesktopPane backgnd = new Background();
           backgnd.setOpaque (false);
	   backgnd.repaint();
	   backgnd.setVisible(true);

	   frame.getContentPane().add(backgnd); 
	   
           JInternalFrame internalframemenu = Internalframemenu(); 
	   internalframemenu.moveToFront();
           internalframemenu.setSelected(true);
           internalframemenu.repaint();

	   frame.setVisible(true);
			
	   backgnd.add(internalframemenu);
		   
	   internalframemenu.setBounds(50,50,300,300);
	   internalframemenu.show();
	}

       public static void main(String[] args)
	{
	   javax.swing.SwingUtilities.invokeLater(new Runnable() 
	    {
              public void run() 
              {
                 try {
			GUI();
		       } 
                  catch (PropertyVetoException e) 
                       {
			  e.printStackTrace();
		        }
               }
	     });
	   }

         public static class Background extends JDesktopPane 
	{
	   private Image img;
		
	   public Background(String sourceimg)
	   {
	     String pathbg;
	     pathbg = "C:\\Users\\...\\img1.jpg";
	    }
	    img = Toolkit.getDefaultToolkit().createImage (pathbg);
	    loadimage(img);		
	  }
			
	    private void loadimage (Image img)
	    {
	      try
		{
		  MediaTracker track = new MediaTracker(this);
		  track.addImage(img, 0);
		  track.waitForID(0);
		 }
	       catch (InterruptedException e)
		{
		  e.printStackTrace();
		}
	      }
		
		public void paint (Graphics g)
		{
		   g.drawImage(img, 0, 0, null);
		   super.paintComponent(g);
		   setOpaque (false);
		}
	     }
          }
Spero di non essermi perso nulla nel copia-incolla.
Grazie a chiunque voglia provare ad aiutarmi.

2 Risposte

  • Re: Problema visualizzazione di JInternalFrame su JDesktopPane

    Io ho fatto così:
    
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    
    
    public class FrameLeague extends JFrame implements ActionListener, MouseListener {
    	
    	private static final long serialVersionUID = 1L;
    	private DesktopFrame dframe;
    	
    	private static final String file="img/sfondo.jpg";
        
    	public FrameLeague() {
            super("Prova");
    
            //Make the big window be indented 50 pixels from each edge
            //of the screen.
            int inset = 0;
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            setBounds(inset, inset, screenSize.width  , screenSize.height );
    	
            setContentPane(dframe);
            setJMenuBar(createMenuBar());
    
            //Make dragging a little faster but perhaps uglier.
            dframe.getDesktop().setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
    
    		
        }
    
        protected JMenuBar createMenuBar() {
            JMenuBar menuBar = new JMenuBar();
    
    
    
            //Set up the lone menu.
            JMenu menu1 = new JMenu("Partite");
            menu1.setMnemonic(KeyEvent.VK_P);
            menuBar.add(menu1);
    
         
            JMenuItem menuItemA = new JMenuItem("Giornata");
            //nuItem.setMnemonic(KeyEvent.VK_N);
            menuItemA.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_A, ActionEvent.ALT_MASK));
            menuItemA.setActionCommand("PAA");
            menuItemA.addActionListener(this);
            menu1.add(menuItemA);
    
     	
    
            return menuBar;
        }
    
        //React to menu selections.
        public void actionPerformed(ActionEvent e) {
        	 if(e.getActionCommand().startsWith("PA")) { //new
                createFrame(e.getActionCommand());
            }
    
           
    	else { //quit
                quit();
            }
        }
    
        //Create a new internal frame.
        protected void createFrame(String tipo) {
            MyInternalFrame frame = new MyInternalFrame(tipo,this, dframe);
            if(tipo.startsWith("CC") || tipo.startsWith("EX"))
            	frame.setVisible(false);
            else
            	frame.setVisible(true); //necessary as of 1.3
            dframe.getDesktop().add(frame);
            try {
                frame.setSelected(true);
    
            } catch (java.beans.PropertyVetoException e) {}
    
        }
    
        //Quit the application.
        protected void quit() {
            System.exit(0);
        }
    }
    
    ----------------------------------------------------
    
    import javax.swing.*;
    import java.awt.*;
    
    
    public class DesktopFrame extends JDesktopPane {
    
    
    	private static final long serialVersionUID = 1L;
    	private Image backImage=null;
    
    
        public DesktopFrame() {
        	super();
        	
        	
        	backImage = new ImageIcon(new java.io.File("img/Serie_A.jpg").getAbsolutePath()).getImage();	
    
        }
    
        protected JDesktopPane getDesktop(){
        	return this;
        }
    
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    	
    
    		g.drawImage(backImage, 0, 0, getWidth(), getHeight(), null);
    	}
    }
    
    ---------------------------------------------------------
    
    /* Used by InternalFrameDemo.java. */
    public class MyInternalFrame extends JInternalFrame implements InternalFrameListener {
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	static int MAX_DAY=38;
    	
        public MyInternalFrame(String tipogirone, FrameLeague gui, DesktopFrame superFrame) {
           
            
            super("Serie A ",
                  false, //resizable
                  true, //closable
                  false, //maximizable
                  true);//iconifiable
            sf=superFrame;
    
    	//Ti chiami il/i metodo/i per esporre ciò che vuoi nella JInternalFrame
           
           
            //...Then set the window size or call pack...
           	setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
        
            pack();
        }
    }
    
    e nel main ti richiami l'oggetto FrameLeague

    Ciao
  • Re: Problema visualizzazione di JInternalFrame su JDesktopPane

    Grazie per la risposta... sono un po' mal messo con il lavoro, appena riesco implemento, provo e ti dico... grazie ancora!!
Devi accedere o registrarti per scrivere nel forum
2 risposte