Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как присвоить каждое сообытие свою иконку в jTree


Автор: XClan 3.2.2004, 16:26
Как присвоить каждое сообытие свою иконку в jTree?
Например имеется 2 операции в конт.меню для какого то элемента в jTree:
То есть нажал на Start - иконка стала зеленой ( то есть активной), нажали на Stop - стала красной ( Не активна)

Код

private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent evt) {
       DefaultTreeModel model = (DefaultTreeModel)jTree1.getModel();
       DefaultMutableTreeNode node = (DefaultMutableTreeNode)
                        jTree1.getLastSelectedPathComponent();
       m_popup = new JPopupMenu();
     if (rootNode == null) return;
       Object object = node.getUserObject();
if ( object instanceof AggregP ) {
                 m_popup = new JPopupMenu();
                 m_popup.add(new AbstractAction("Start") {
                   public void actionPerformed(ActionEvent e) {
               ?confused.gif?? // передача сообытий для изминения иконки, если не соответвует выбранному статусу иконки   или отмена
            }
            });
                 m_popup.add(new AbstractAction("Stop") {
                   public void actionPerformed(ActionEvent e) {
                 ?confused.gif?? // передача сообытий для изминения иконки, если не соответвует выбранному статусу иконки  или отмена
            }
            });
                 jTree1.add(m_popup);
      }


Если для иконок в jTree имеется такого рода код:
Код

private class MyIconTree extends DefaultTreeCellRenderer {
       ImageIcon Aggreg_activ;
       ImageIcon Aggreg_no_activ;
       public MyIconTree() {
           Aggreg_activ = new javax.swing.ImageIcon(getClass().getResource("/images/green_a.gif")); // активная
           Aggreg_no_activ = new javax.swing.ImageIcon(getClass().getResource("/images/red_a.gif")); // не активная
       }
       public Component getTreeCellRendererComponent(
                               JTree tree, Object value, boolean selected,
                               boolean expanded, boolean leaf, int row, boolean hasFocus) {
           Component result = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
       DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
       Object object = node.getUserObject();
           setText(object.toString());
                 if(object instanceof AggregP){
               setIcon(Aggreg_no_activ); //по умолчанию не активная
           }
           return result;
       }
   }

Автор: KDA 4.2.2004, 08:45
getTreeCellRendererComponent вызывается каждый раз при перерисовке
узла дерева, поэтому в объкт AggregP необходимо определить поле
boolean active и в указанном выше методе проверять данное поле и
установливать соответствующее изображение. Кроме этого при выборе
элемента в PopupMenu необходимо изменить active и вызвать перерисовку
данного узла

Автор: XClan 4.2.2004, 15:39
Попробовал твой метод и запутался окончательнос c boolean active! :{ Хотя твои мысли я понял......

Автор: XClan 5.2.2004, 11:50
У меня что-то не получается - может я где-то ошибся ?
Помогите плиззззззз smile.gif
Код

   private class MyIconTree extends DefaultTreeCellRenderer {
       ImageIcon Aggreg_activ;
       ImageIcon Aggreg_no_activ;

       public MyIconTree() {
           Aggreg_activ = new javax.swing.ImageIcon(getClass().getResource("/images/green_a.gif"));
           Aggreg_no_activ = new javax.swing.ImageIcon(getClass().getResource("/images/red_a.gif"));
       }
       
       public Component getTreeCellRendererComponent(
                               JTree tree, Object value, boolean selected,
                               boolean expanded, boolean leaf, int row, boolean hasFocus) {
           Component result = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
       DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
       MyTreeNode obj=(MyTreeNode)node.getUserObject();
         setText(obj.toString());
         if(obj instanceof AggregP){
            if(obj.getCmpStatus() == 1){
              setIcon(Aggreg_activ);
         }else{
              setIcon(Aggreg_no_activ);
                    }
           }
           return result;
   }
   }


и второй код реагирующая на нажати кнопокй мышки на конт.меню...

Код

private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent evt) {
      DefaultTreeModel model = (DefaultTreeModel)jTree1.getModel();
      DefaultMutableTreeNode node = (DefaultMutableTreeNode)
                       jTree1.getLastSelectedPathComponent();
      m_popup = new JPopupMenu();
    if (rootNode == null) return;
                 MyTreeNode aggP= (MyTreeNode) object;
if ( object instanceof AggregP ) {
                m_popup = new JPopupMenu();
                m_popup.add(new AbstractAction("Start") {
                  public void actionPerformed(ActionEvent e) {
                          aggP.setCmpStatus(1);
           }
           });
                m_popup.add(new AbstractAction("Stop") {
                  public void actionPerformed(ActionEvent e) {
                          aggP.setCmpStatus(0);
           }
           });
                jTree1.add(m_popup);
     }


Проблемы в aggP.setCmpStatus(1);
Сам конструктор MyTreeNode выглядит так:

Код

public class MyTreeNode extends Object {

       public void setActive(boolean act_ok)
               {
               active = act_ok;
               }

       public boolean isActive()
               {
                return active;
               }

       public void setCmpStatus(int s){
           status=s;
       }
       public int getCmpStatus(){
           return status;
       }

       private boolean active;
       protected int status;
}

Thanks!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)