2011-12-14 3 views
1

Я разработал следующую структуру дерева:Двойного значка для структуры дерева в Matlab

function tree 
import javax.swing.* 
import javax.swing.tree.*; 
[I,map] = checkedIcon; 
javaImage_checked = im2java(I,map); 
[I,map] = uncheckedIcon; 
javaImage_unchecked = im2java(I,map); 

% javaImage_checked/unchecked are assumed to have the same width 
iconWidth = javaImage_unchecked.getWidth; 

% create top node 
root = uitreenode('v0','root', 'Results',[], 0); 
% create children with checkboxes 
Node1 = uitreenode('v0','Node1', 'Position', [], false); 
root.add(Node1); 
Node11 = uitreenode('v0','Node11', 'Cartesians Coordinates', [], true); 
Node11.setIcon(javaImage_checked); 
Node1.add(Node11); 
Node12 = uitreenode('v0','Node12', 'Spherical Coordinates', [], true); 
Node12.setIcon(javaImage_unchecked); 
Node1.add(Node12); 
Node2 = uitreenode('v0','Node2', 'Velocity', [], false); 
root.add(Node2); 
Node3 = uitreenode('v0','Node3', 'Acceleration', [], false); 
root.add(Node3); 

% set treeModel 
treeModel = DefaultTreeModel(root); 

% create the tree 
[tree, container]= uitree('v0'); 
tree.setModel(treeModel); 
% make root the initially selected node 
tree.setSelectedNode(Node11); 

function [I,map] = checkedIcon() 
    I = uint8(... 
     [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0; 
     2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,1; 
     2,2,2,2,2,2,2,2,2,2,2,2,0,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,0,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,0,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,0,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,0,0,1,1,2,2,3,1; 
     2,2,1,0,0,1,1,0,0,1,1,1,2,2,3,1; 
     2,2,1,1,0,0,0,0,1,1,1,1,2,2,3,1; 
     2,2,1,1,0,0,0,0,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,0,0,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,0,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,1; 
     2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,1; 
     1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1]); 
    map = [0.023529,0.4902,0; 
      1,1,1; 
      0,0,0; 
      0.50196,0.50196,0.50196; 
      0.50196,0.50196,0.50196; 
      0,0,0; 
      0,0,0; 
      0,0,0]; 
    end 

    function [I,map] = uncheckedIcon() 
    I = uint8(... 
     [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1; 
     2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1; 
     2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,1,1,1,1,1,1,1,1,1,1,2,2,3,1; 
     2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,1; 
     2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,1; 
     1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1]); 
    map = ... 
     [0.023529,0.4902,0; 
     1,1,1; 
     0,0,0; 
     0.50196,0.50196,0.50196; 
     0.50196,0.50196,0.50196; 
     0,0,0; 
     0,0,0; 
     0,0,0]; 
    end 

    end 

Я хотел бы иметь возможность показать дополнительный значок (справа проверяемой/непроверенной иконки и слева имен узлов). Решение, которое, как я думал, заменяет имя узла компонентом jLabel.

icon2 = javax.swing.ImageIcon('image.jpg'); 
jLabel = javax.swing.JLabel('Cartesian Coordinates'); 
jLabel.setIcon(icon2); 
Node11.setName(jLabel); 

Однако приведенный выше код не работает. Я также попытался добавить компонент jLabel в treenode без успеха. Я даже попытался изменить свойство setIcon для DefaultCheckBoxNode, но этот компонент не обладает этим свойством. Итак, я спросил себя, есть ли какое-то решение для моей проблемы.

ответ

2

Вы можете создать значок, который представляет собой комбинацию двух значков, нарисованных бок о бок, и установить этот значок на узле дерева. Я не уверен, что это можно сделать, используя только API MATLAB, но я понимаю, что вы можете создавать и работать с объектами Java непосредственно в MATLAB, поэтому это должно быть возможно в любом случае.

Метод setIcon() принимает объект Java Image, а не объект Icon. Вот общая стратегия для создания составного изображения:

  1. Создать BufferedImage объект с соответствующей шириной и высотами, чтобы держать обе иконки
  2. Получить Graphics2D объект для буферных изображений с помощью BufferedImage.createGraphics()
  3. рисовать каждую иконку в буферном изображение с помощью Graphics2D.drawImage()

This question и this question могут быть полезными для вас.

+0

Благодарим вас за ответ. Однако я не знаю программирования Java, и мне сложно получить решение. – julian