2013-06-23 1 views
0

Je suis en train d'écrire un programme qui tente de simuler l'évolution d'une espèce, et il a une fenêtre qui ressemble à ceci: enter image description hereJDesktopPane et BorderLayout

origine la zone vide en bas à droite était un groupe spécial, et il est destiné à dessiner une représentation visuelle des spécimens, des emplacements et des chemins de déplacement (cela n'a pas vraiment d'importance). Cependant, vous serez en mesure d'ouvrir une sorte de fenêtre qui vous permet de créer/modifier différents éléments (comme les espèces, les lieux et les chemins de voyage). À l'origine, j'ai prévu que ceux-ci soient simplement des fenêtres contextuelles. Mais, je pensais que j'utiliserais peut-être les volets JInternal pour les popups, et l'écran de représentation visuelle.

Donc, dans mon constructeur de JFrames:

JDesktopPane pane = new JDesktopPane(); 
this.setContentPane(pane); 
setLayout(new BorderLayout());//To layout the menubar, and the items on the left 

panel = new GraphicsPanel(manager); 
panel.setVisible(true); 

Et dans le constructeur Panel Graphics: super("Graphic Project View",true,false,true,true);

Cela verrouille le Groupe spécial BorderLayout.CENTER, et il se remplit tout l'espace, ne permettant pas autre chose . Je suppose que c'est parce que JDesktopPanes utilise un OverlayLayout, et quand je mets la mise en page à BorderLayout qui remplace OverlayLayout, mon InternalFrame vient juste d'être ajouté au centre. Donc, la question est: Comment puis-je mettre en page les choses comme le JMenuBar, et le panneau gauche de la salle comme ils le sont maintenant, tout en maintenant la possibilité d'avoir JInternalFrames? Pour l'instant, je vais ajouter le JMenuBar via JFrame.setJMenuBar (JMenuBar) au lieu de JFrame.add (menuBar, BorderLayout.NORTH), puis changer le panneau sur la gauche dans un cadre JInternal, mais si possible, je Je préfère l'avoir tel quel. Je voudrais que je puisse simplement ajouter le DesktopPane au JFrame à BorderLayout.CENTER, puis ajouter le cadre au volet Bureau. Si le InternalFrame était limité à cette région, ça ne m'intéresserait pas, tant que c'est encore mobile, ect.

EDIT: Comment ajouter JInternalFrame (Désolé, il dit encore le panneau, mais il a été converti en un JInternalFrame):

panel = new GraphicsPanel(manager); 
panel.setSize(desktop.getSize()); 
panel.setLocation(0,0); 
panel.setVisible(true); 
desktop.add(panel); 

Répondre

3

Je commencerais par un seul JPanel (laisse tout ce qu'il le volet de base), qui abritera les autres conteneurs.

En utilisant une disposition de bordure, j'ajouterais un panneau "controls" à la position WEST du volet de base. Sur la position CENTER, j'ajouterais le JDesktopPane.

Je définirais la disposition des fenêtres principales à BorderLayout et y ajouterais le volet de base. Cela vous permettra d'utiliser JFrame#setJMenuBar pour gérer la barre de menus tout en conservant le résultat de la mise en page.

Cela vous permettra de contenir d'utiliser les JInternalFrame s sur le bureau sans affecter le reste de la mise en page ...

Exemple simple

Voici un exemple très simplifié utilisé pour démontrer la concept de base décrit ci-dessus ...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class SimpleLayout { 

    public static void main(String[] args) { 
     new SimpleLayout(); 
    } 

    public SimpleLayout() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JMenuBar mb = new JMenuBar(); 
       mb.add(new JMenu("File")); 
       mb.add(new JMenu("Add")); 
       mb.add(new JMenu("Edit")); 
       mb.add(new JMenu("Analize")); 
       mb.add(new JMenu("About")); 

       JFrame frame = new JFrame("Testing"); 
       frame.setJMenuBar(mb); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new BasePane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class BasePane extends JPanel { 

     private JTextArea species; 
     private JTextArea locations; 
     private JTextArea travelPaths; 

     private JDesktopPane desktopPane; 

     public BasePane() {     
      setLayout(new BorderLayout()); 

      desktopPane = new JDesktopPane(); 

      species = new JTextArea("Species"); 
      locations = new JTextArea("Locations"); 
      travelPaths = new JTextArea("TravelPaths"); 

      JPanel controls = new JPanel(new GridLayout(3, 0)); 
      controls.add(new JScrollPane(species)); 
      controls.add(new JScrollPane(locations)); 
      controls.add(new JScrollPane(travelPaths)); 

      add(controls, BorderLayout.WEST); 
      add(desktopPane); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     }    
    }   
} 

Vos besoins peuvent être légèrement différence, mais le concept de base devrait vous faire bouger.

Selon la structure de votre application, je pourrais être tenté de séparer le volet Controls en une classe distincte.

+0

@camickr Oui, je suis d'accord, mais j'ai tendance à construire mon interface utilisateur loin du cadre, donc c'est une force d'habitude. Pour moyen, cela signifie que je peux ramasser le volet "base" et le laisser tomber où je veux. Je suppose que beaucoup dépendrait de l'interrelation entre les "contrôles" et le bureau. Si elle était modélisée correctement, vous n'auriez pas besoin du volet "base" car les modèles effectueraient le travail – MadProgrammer

+0

Bon point, c'est le meilleur design. Suppression du commentaire (donc je ne donne pas une mauvaise suggestion aux gens). – camickr

+0

J'ai essayé ça et ça n'a pas marché, peut-être que j'ai fait quelque chose de mal, je vais essayer à nouveau. Si cela fonctionne, j'accepterai votre réponse. – csga5000