Иметь com.l2fprod.common.propertysheet.PropertySheetPanel для отображения составного класса - PullRequest
9 голосов
/ 11 мая 2009

Чтобы в Netbeans появились окна инспектора свойств, я использую следующий класс, чтобы помочь мне достичь этого.

com.l2fprod.common.propertysheet.PropertySheetPanel

Пока что он отлично работает для класса с простыми свойствами, такими как String, int ...

Однако, когда дело доходит до слегка сложного класса с составными отношениями, все становится сложнее.

Например, у меня есть два животных (интерфейс). Один из них - Cat (простой класс с именем и возрастом) и Dog (Другой простой класс с именем и возрастом).

Нет необходимости отображать их через окна графического интерфейса.

Тем не менее, когда приходят на занятия со сложными отношениями. В зоопарке, который может содержать несколько животных (класс со списком массивов для хранения животных), у меня проблема с отображением всех свойств животных в одном окне.

Ниже приведен снимок экрана

alt text
(источник: googlepages.com )

Здесь показан частичный исходный код

    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);

Полный исходный код можно загрузить с

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

Я хочу, чтобы в окнах "Зоопарк" он мог отображать все свойства всех животных.

1 Ответ

0 голосов
/ 11 мая 2009

PropertySheetPanel as is только заполняет свою таблицу, читая свойства для данного Java Bean.

Вам необходимо расширить поведение PropertySheetPanel и заполнить свойства из данной Коллекции. Выполните итерацию своей коллекции и используйте addProperty (Property) для заполнения таблицы.

Вы также можете использовать instrospection или beanutils lib, чтобы обнаружить элементы коллекции.

РЕДАКТИРОВАТЬ: Пример добавлен.

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;
            }
        });
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...