Аккордеонный компонент Netbeans - PullRequest
2 голосов
/ 04 января 2012

В одном из проектов, над которым я работаю, мы решили изменить представление некоторых данных. Сейчас мы используем NetBeans ListView, и до сих пор прекрасно работает. Но теперь мы хотим изменить / расширить ListView, чтобы он работал как аккордеон. Мы можем расширить ListView, чтобы он выглядел как аккордеон, но если мы добавим кнопки или текстовые вводы в каждую ячейку / строку, мы не сможем прикрепить actionListener к этой кнопке. Кажется, что слушатели ListView всегда находятся над компонентами колебания.

У кого-нибудь есть предложения по созданию аккордеона с использованием Netbeans Explorer API?

Мы могли бы создать пользовательский компонент Swing, который действует так, на самом деле он уже существует в сети. Если мы его создадим, нам нужно будет подключить Lookup с нашим настраиваемым компонентом Swing для правильной работы с API Netbeans. Мы хотим сделать это, только если нет других вариантов. Поиск в Google такого компонента, который использует API-интерфейсы Netbeans, не дал никаких полезных результатов.

Ответы [ 3 ]

4 голосов
/ 04 января 2012

Взято из Toni Epples blog

Обратите внимание:

  • При этом используется JXTaskPane
  • Это пример не динамический1010 *

пример кода

public class TaskPaneView extends JScrollPane {

    private transient ExplorerManager manager;
    // create a taskpanecontainer
    JXTaskPaneContainer taskpanecontainer = new JXTaskPaneContainer();
    /** Listener to nearly everything */
    transient Listener managerListener;
    /** weak variation of the listener for property change on the explorer manager */
    transient PropertyChangeListener wlpc;

    /** True, if the selection listener is attached. */
    transient boolean listenerActive;

    // UI Settings:
    Font labelFont = new Font("Segoe UI", Font.BOLD, 14);
    Painter backgroundPainter = new MattePainter(Color.white);

    public TaskPaneView() {
        setViewportView(taskpanecontainer);
    }

    public void setBackground(Painter background) {
        this.backgroundPainter = background;
    }

    public void setLabelFont(Font labelFont) {
        this.labelFont = labelFont;
    }

    @Override
    public void addNotify() {
        super.addNotify();
        ExplorerManager em = ExplorerManager.find(this);
        if (em != manager) {
            if (manager != null) {
                manager.removePropertyChangeListener(wlpc);
            }
            manager = em;
            manager.addPropertyChangeListener(wlpc = WeakListeners.propertyChange(managerListener, manager));
            Node root = manager.getExploredContext();
            setRootNode(root);
        } else {
            // bugfix #23509, the listener were removed --> add it again
            if (!listenerActive && (manager != null)) {
                manager.addPropertyChangeListener(wlpc = WeakListeners.propertyChange(managerListener, manager));
            }
        }
    }

    /** Removes listeners.
     */
    @Override
    public void removeNotify() {
        super.removeNotify();
        listenerActive = false;
        // bugfix #23509, remove useless listeners
        if (manager != null) {
            manager.removePropertyChangeListener(wlpc);
        }
    }

    private void setRootNode(Node root) {
        //throw new UnsupportedOperationException("Not yet implemented");
        taskpanecontainer.removeAll();

        System.out.println("root node set " + root);
        Node[] children = root.getChildren().getNodes();
        for (int i = 0; i < children.length; i++) {
            Node node = children[i];
            JXTaskPane taskPane = new JXTaskPane();
            taskPane.setName(node.getName());
            taskPane.setCollapsed(true);
            taskPane.setTitle(node.getDisplayName());
            taskPane.setIcon(new ImageIcon(node.getIcon(BeanInfo.ICON_COLOR_16x16)));
            Action [] actions = node.getActions(true);
            for (int j = 0; j < actions.length; j++) {
                Action action = actions[j];
                taskPane.add(action);
            }
            taskpanecontainer.add(taskPane);
        }
    }

    private final class Listener implements PropertyChangeListener {

        public void propertyChange(PropertyChangeEvent evt) {

            if (ExplorerManager.PROP_EXPLORED_CONTEXT.equals(evt.getPropertyName())) {
                setRootNode(manager.getExploredContext());
                return;
            }
        }
    }
}

Example image

3 голосов
/ 04 января 2012
2 голосов
/ 04 января 2012

Поскольку он может использоваться независимо, NetBeans '1001 *Outline, показанный здесь здесь , может быть хорошей альтернативой.См. Также Node представлений , доступных в платформе NetBeans.

...