2011-12-05 2 views
0

J'ai un ensemble de JInternalFrame dans un Jpanel. et le JPanel est gridlayout. Je dois définir un seul JInternalFrame à sélectionner dans le conteneur (JPanel). J'ai créé dynamiquement l'instance JInternalFrame et l'ajouter au panneau. J'ai toujours la liste de JInternalFrame mais comment en faire un seul pour définir sélectionné.Sélection parmi plusieurs JInternalFrames dans un conteneur (JPanel)

Répondre

3

Comme suggéré dans How to Use Internal Frames, "Habituellement, vous ajoutez des cadres internes à un volet de bureau." Cela vous permet d'utiliser activateFrame() pour indiquer qu'un cadre a le focus. Dans ce example, un javax.swing.Action est utilisé pour sélectionner des images d'un menu via setSelected(). Une discussion supplémentaire peut être trouvée dans ce Q&A.

Addendum: Si vous souhaitez utiliser un JPanel, peut-être d'obtenir une belle GridLayout, une aproche est d'utiliser un InternalFrameListener comme indiqué ci-dessous.

enter image description here

import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.beans.PropertyVetoException; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.event.InternalFrameAdapter; 
import javax.swing.event.InternalFrameEvent; 

/** @see https://stackoverflow.com/questions/8389640 */ 
public class InternalGrid extends JPanel { 

    private final List<MyFrame> list = new ArrayList<MyFrame>(); 

    public InternalGrid() { 
     super(new GridLayout(2, 2)); 
     for (int i = 0; i < 4; i++) { 
      MyFrame f = new MyFrame("Frame", i); 
      list.add(f); 
      this.add(f); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("InternalGrid"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new InternalGrid().display(); 
      } 
     }); 
    } 

    class MyFrame extends JInternalFrame { 

     MyFrame(String name, int i) { 
      super(name + String.valueOf(i), true, true, true, false); 
      this.pack(); 
      this.setVisible(true); 
      this.setLayout(new FlowLayout()); 
      this.add(new JLabel("Hi, I'm " + this.getTitle())); 
      this.addInternalFrameListener(new InternalFrameAdapter() { 

       @Override 
       public void internalFrameActivated(InternalFrameEvent e) { 
        for (MyFrame f : list) { 
         if (f != MyFrame.this) { 
          try { 
           f.setSelected(false); 
          } catch (PropertyVetoException ex) { 
           System.out.println(ex); 
          } 
         } 
        } 
       } 
      }); 
     } 
    } 
} 
+0

thank u ur réponse, mais j'ai une situation à utiliser dans un JPanel ici. – Pratap

+1

trashgod est juste cependant; soit substituer le parent JPanel par un JDesktopPane, ou vous avez un cas que personne d'autre n'utilise. Vous pouvez commencer à placer chaque JInternalFrame dans son propre JDesktopPane et, lors du changement de sélection, sélectionner celui qui a déjà été sélectionné. –

+0

@Joop soulève un bon point. Par exemple, «iconifiable» devient sans signification en dehors d'un volet de bureau. Code et image mis à jour. – trashgod