2010-03-20 23 views
1

Je suis la programmation d'un programme court de peinture comme je suis en train de faire pour lui une architecture MDI. Pour y arriver, j'ai utilisé JInternalFrame dans un JDesktopPane. Bien que j'obtienne en quelque sorte plusieurs images, elles ne fonctionnent pas vraiment correctement. Fondamentalement, si j'ai 2 JInternalFrame je ne peux dessiner que sur le dernier. L'autre semble être désactivé.Java - Comment rendre un ensemble de JInternalFrame indépendant les uns des autres?

Voici une courte vidéo illustrant le problème. http://bit.ly/9ydiwM

Voici une partie du code.

Panneau.java 
public class Panneau extends JDesktopPane 
{ 

    /** La liste de fenêtres ouvertes */ 
    private static ArrayList<Cadre> cadres; 

    /** Le pannel comportant la liste des formes à dessiner*/ 
    private Pannel pannel; 

    /** La barre d'outils */ 
    private ToolBox toolBox; 

    public Panneau() 
    { 

     this.setLayout(new BorderLayout()); 

     // Initialisations des listes de cadres 
     cadres = new ArrayList<Cadre>(); 

     // En haut ToolBox 
     toolBox = new ToolBox(); 
     this.add(toolBox, BorderLayout.NORTH); 

     **// Intialisation de la première internal frame 
     Cadre cadre = new Cadre(); 
     this.add(cadre, BorderLayout.CENTER);** 

     cadres.add(cadre); 

     // Ajout du pannel à gauche 
     pannel = new Pannel(); 

     this.add(pannel, BorderLayout.WEST); 

    } 

    /** 
    * Crée une nouvelle fenêtre de dessin 
    * 
    */ 
    **public void createNewInternalFrame() 
    { 
     Cadre cadre = new Cadre(); 
     this.add(cadre, BorderLayout.CENTER); 

     cadres.add(cadre); 
    }** 
} 

public class Cadre extends JInternalFrame 
{ 
    /** Largeur par d'une fenêtre interne */ 
    private int width; 

    /** Hauteur d'une fenêtre interne */ 
    private int height; 

    /** Titre d'une fenêtre interne */ 
    private String title; 

    /** Toile associée à la fenêtre interne */ 
    private Toile toile; 

    public Cadre() 
    { 
     width = 400; 
     height = 400; 
     title = "Form"; 

     toile = new Toile(); 

     this.setTitle(title); 

     this.setSize(width, height); 

     this.setEnabled(true); 

     this.setResizable(true); 

     this.setAutoscrolls(true); 

     this.setClosable(true); 

     this.setIconifiable(true); 

     this.setDoubleBuffered(true); 

     this.setContentPane(toile); 

     this.setVisible(true); 

     this.pack();  
    } 
} 

Fondamentalement, Panneau est la fenêtre principale qui contient toutes les différentes parties de l'interface graphique. Je peux créer autant de JInternalFrame que je veux, en utilisant: Panneau.createNewInternalFrame(). Toile est essentiellement où je dessine mes formes.

Une idée?

Merci

Répondre

3

Vous utilisez le JDesktopPane correctement. Le panneau de bureau "n'utilise pas" un gestionnaire de disposition à dessein. Cela vous permet d'ajouter plusieurs cadres internes et de les faire glisser individuellement.

Votre classe ne devrait pas être d'étendre JDesktopPane puisque vous n'êtes pas ajouter de nouvelles fonctionnalités à elle.

Donc, en général, tout ce que vous la logique doit encore faire face à la JFrame. C'est:

a) la création de votre barre d'outils et l'ajouter au nord du volet contenu.

b) vous créez votre volet de bureau et de l'ajouter au centre de la sous-fenêtre de contenu

c) votre créer vos cadres internes et et les dans le volet de bureau

Lire le tutoriel Swing pour des exemples de en utilisant des cadres internes.

+0

Vous aviez raison. J'ai changé la façon dont mon interface graphique a été construite. Maintenant, j'ai un JFrame au lieu d'un JPanel et ça marche très bien!Il y a juste un petit problème: je ne peux pas redimensionner aucun de mes JInternalFrame (s). Quand j'essaie de le faire, ils se placent dans le coin supérieur et ils semblent être handicapés. –

+0

Encore une fois, le tutoriel Swing a des exemples de travail qui utilisent des cadres internes et ils ne présentent pas ce comportement. Je n'ai aucune idée de ce que vous pourriez faire différemment. Comparez votre code avec le code du didacticiel pour voir ce qui est différent. – camickr

2

Je pense que le problème est que vous écrasez l'orientation CENTRE dans BorderLayout. L'effet de ceci est que les deux boîtes sont essentiellement la deuxième boîte ajoutée, qui fait des ravages avec le composant qui n'est tout simplement pas conçu pour cela. Ainsi, la hiérarchie a deux éléments différents, et le gestionnaire de disposition a le deuxième élément définir le composant CENTRE, et le gestionnaire de disposition gère probablement un peu de choses.

Notez le code suivant dans BorderLayout (oui, il est dépréciée, mais il est appelé par la méthode non dépréciée de toute façon):

/** 
* @deprecated replaced by <code>addLayoutComponent(Component, Object)</code>. 
*/ 
@Deprecated 
public void addLayoutComponent(String name, Component comp) { 
    synchronized (comp.getTreeLock()) { 
    /* Special case: treat null the same as "Center". */ 
    if (name == null) { 
     name = "Center"; 
    } 

    /* Assign the component to one of the known regions of the layout. 
    */ 
    if ("Center".equals(name)) { 
     center = comp; 
    } else if ("North".equals(name)) { 
     north = comp; 
    } else if ("South".equals(name)) { 
     south = comp; 
    } else if ("East".equals(name)) { 
     east = comp; 
    } else if ("West".equals(name)) { 
     west = comp; 
    } else if (BEFORE_FIRST_LINE.equals(name)) { 
     firstLine = comp; 
    } else if (AFTER_LAST_LINE.equals(name)) { 
     lastLine = comp; 
    } else if (BEFORE_LINE_BEGINS.equals(name)) { 
     firstItem = comp; 
    } else if (AFTER_LINE_ENDS.equals(name)) { 
     lastItem = comp; 
    } else { 
     throw new IllegalArgumentException("cannot add to layout: unknown constraint: " + name); 
    } 
    } 
} 

Il serait cool d'utiliser un gestionnaire de mise en page appropriée pour faire le travail , mais ils ne sont pas conçus pour le nettoyage avec des fenêtres MDI.

+0

L'ajout de deux composants à la zone CENTER du même conteneur BorderLayout entraîne simplement le remplacement du premier composant par le second. Donc, je pense que l'utilisation de BorderLayout.CENTER pourrait certainement conduire au problème décrit ici. –