2011-05-15 62 views
2

我正在做一個Java項目,其中包括一點點的圖形的東西。我想在手風琴菜單的某種東西下顯示一組BufferedImages。這意味着當我點擊一個Accordion菜單根項目時,它應該在該名稱下顯示一組圖像,並且當點擊另一個根菜單項目時,它應該顯示另一組圖像。我怎麼能用Java實現這個?有沒有辦法將JPanel添加爲Accordion菜單葉子項目?如果任何人都可以提供示例代碼,那真的很明顯。手風琴菜單顯示在Java中的圖像集

+0

設置JMenuItem的圖標有什麼問題? – spot35 2011-05-16 16:23:02

回答

1

忍不住一些有趣:事實證明,可以稍微調整一個JXTaskPaneContainer(在SwingX中)以表現類似於手風琴。所有這些都需要它來強制擴展所包含的JXTaskPaneContainers中的至多一個。類似代碼片段:

JXTaskPaneContainer container = new JXTaskPaneContainer() { 

     private JXTaskPane current; 

     private PropertyChangeListener expansionListener; 

     /** 
     * @inherited <p> 
     */ 
     @Override 
     protected void addImpl(Component comp, Object constraints, int index) { 
      super.addImpl(comp, constraints, index); 
      if (comp instanceof JXTaskPane) { 
       grabExpansionControl((JXTaskPane) comp); 
      } 
     } 

     private void grabExpansionControl(JXTaskPane comp) { 
      if (current != null) { 
       comp.setCollapsed(true); 
      } else { 
       current = comp; 
       comp.setCollapsed(false); 
      } 
      comp.addPropertyChangeListener("collapsed", 
        getExpansionListener()); 
     } 

     private void updateCurrentTaskPane(JXTaskPane source) { 
      if (source != current) { 
       if (!source.isCollapsed()) { 
        if (current != null) { 
         current.setCollapsed(true); 
        } 
        current = source; 
       } 
      } 
     } 

     private PropertyChangeListener createExpansionListener() { 
      PropertyChangeListener l = new PropertyChangeListener() { 

       @Override 
       public void propertyChange(PropertyChangeEvent evt) { 
        // TODO Auto-generated method stub 
        updateCurrentTaskPane((JXTaskPane) evt.getSource()); 
       } 
      }; 
      return l; 
     } 


     private PropertyChangeListener getExpansionListener() { 
      if (expansionListener == null) { 
       expansionListener = createExpansionListener(); 
      } 
      return expansionListener; 
     } 


    }; 
    ((VerticalLayout) container.getLayout()).setGap(0);