2009-05-11 8 views
9

Afin d'avoir une fenêtre d'inspecteur de propriétés Netbeans aimé, j'utilise la classe suivante pour m'aider à atteindre cet objectif.Avoir com.l2fprod.common.propertysheet.PropertySheetPanel pour afficher la classe composée

com.l2fprod.common.propertysheet.PropertySheetPanel

Jusqu'à présent, il fonctionne très bien pour la classe avec des propriétés simples comme String, int ...

Cependant, quand venir en classe un peu compliquée avec relation Composited , les choses deviennent plus compliquées.

Par exemple, j'ai deux animaux (interface). L'un est Cat (classe simple avec le nom et l'âge) et Dog (une autre classe simple avec le nom et l'âge).

Il ne fait aucun effort pour les afficher via les fenêtres GUI.

Cependant, lorsque vous venez en classe avec une relation composite. Un zoo, qui peut contenir plusieurs animaux (une classe avec une liste de tableaux pour contenir des animaux), j'ai un problème pour afficher toutes les propriétés des animaux dans une seule fenêtre.

Ce qui suit est le tournage d'écran

alt text http://yancheng.cheok.googlepages.com/object-inspector.png

code source partielle est présentée ici

ObjectInspectorJFrame objectInspectorJFrame0 = new ObjectInspectorJFrame(cat); 
    objectInspectorJFrame0.setVisible(true); 
    objectInspectorJFrame0.setState(java.awt.Frame.NORMAL); 

    ObjectInspectorJFrame objectInspectorJFrame1 = new ObjectInspectorJFrame(dog); 
    objectInspectorJFrame1.setVisible(true); 
    objectInspectorJFrame1.setState(java.awt.Frame.NORMAL); 

    // I wish to see all "animals" and their properties in this windows. :(
    // How? 
    ObjectInspectorJFrame objectInspectorJFrame2 = new ObjectInspectorJFrame(zoo); 
    objectInspectorJFrame2.setVisible(true); 
    objectInspectorJFrame2.setState(java.awt.Frame.NORMAL); 

Le code source complet peut être téléchargé à partir

http://yancheng.cheok.googlepages.com/sandbox.zip

Je souhaite dans les fenêtres "Zoo", il peut afficher toutes les propriétés pour tous les animaux.

+0

Je suis très intéressé de savoir si vous avez trouvé une solution à ce problème. J'ai exactement le même problème – I82Much

Répondre

0

PropertySheetPanel ne remplit sa table qu'en lisant les propriétés d'un bean Java donné.

Vous devez étendre le comportement de PropertySheetPanel et remplir les propriétés d'une collection donnée. Itérez votre collection et utilisez addProperty (Property) pour remplir la table.

Vous pouvez également utiliser instrospection ou beanutils lib pour découvrir les éléments de la collection.

EDIT: Exemple ajouté.

package com.stackoverflow.swing.PropertySheetPanel; 

import java.util.ArrayList; 
import java.util.Collection; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

import com.l2fprod.common.propertysheet.DefaultProperty; 
import com.l2fprod.common.propertysheet.PropertySheetPanel; 

/** 
* An example that creates a l2fprod PropertySheetPanel that displays any 
* Collection. 
*/ 
public class CollectionPropertySheet<C> extends PropertySheetPanel { 

    // Choose some bean. An animal as example. 
    static class Animal { 
     private String name; 
     private String family; 

     public Animal(String name, String family) { 
      this.name = name; 
      this.family = family; 
     } 

     @Override public String toString() { 
      return name + " " + family; 
     } 
    } 

    /** 
    * @param simpleModel The input collection as data model. 
    */ 
    public CollectionPropertySheet(Collection<C> simpleModel) { 
     super(); 
     populateCollectionProperties(simpleModel); 
    } 

    private void populateCollectionProperties(Collection<C> collection) { 
     int index = 0; 
     for (C entry : collection) { 
      // Define property properties 
      DefaultProperty property = new DefaultProperty(); 
      property.setDisplayName(entry.getClass().getSimpleName() + "[" + index++ +"]"); 
      property.setValue(entry.toString()); 
      // Set any other properties ... 
      // and add. 
      addProperty(property); 
     } 
    } 

    // Start me here! 
    public static void main(String[] args) { 
     // Inside EDT 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override public void run() { 
       JFrame frame = new JFrame("A simple example..."); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new CollectionPropertySheet<Animal>(getAnimals())); 
       frame.pack(); 
       frame.setVisible(true); 
      } 

      private Collection<Animal> getAnimals() { 
       Collection<Animal> animals = new ArrayList<Animal>(); 
       animals.add(new Animal("Lion", "Felidae")); 
       animals.add(new Animal("Duck", "Anatidae")); 
       animals.add(new Animal("Cat", "Felidae")); 
       return animals; 
      } 
     }); 
    } 

} 
+0

Ceci est un exemple de classe avec des champs primitifs. Cependant, je cherche la réponse pour la classe avec le champ composé. Voici ma solution pour la classe avec les champs primitifs. http://jstock.cvs.sourceforge.net/viewvc/jstock/jstock/src/org/yccheok/jstock/gui/ObjectInspectorJPanel.java?view=markup –

Questions connexes