2012-01-04 51 views
2

在我正在進行的一個項目中,我們決定更改一些數據的表示。現在我們正在使用Netbeans ListView,並且迄今爲止效果很好。但是現在我們想要改變/擴展ListView以像手風琴一樣工作。我們可以將ListView擴展爲看起來像手風琴,但是如果我們將按鈕或文本輸入添加到每個單元格/行,我們不能將actionListener附加到該按鈕。看起來ListView監聽器總是在swing組件之上。Netbeans手風琴部件

有沒有人有任何建議如何使用Netbeans Explorer API創建手風琴?

我們可以創建自定義的Swing組件,其行爲就像那樣,實際上在網絡上已經存在一個。如果我們創建一個,我們需要將Lookup與我們的自定義Swing組件連接起來,以便與Netbeans API正常協作。只有在沒有其他選擇的情況下,我們纔會這樣做。 使用Netbeans API搜索此類組件沒有提供任何有用的結果。

回答

4

Toni Epples blog

兩者必須注意:

  • 它使用JXTaskPane
  • 這是一個例子不是動態

代碼示例

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

+0

這個論壇的編輯也讓我瘋了+1 – mKorbel 2012-01-04 18:06:31

2

因爲它可以獨立使用,NetBeans的Outline(圖示爲here)可能是一個很好的選擇。另請參閱NetBeans平臺中提供的Nodeviews