Swing Matlab中树形结构的双图标

Swing Matlab中树形结构的双图标,swing,matlab,icons,jtree,nodes,Swing,Matlab,Icons,Jtree,Nodes,我设计了以下树结构: 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

我设计了以下树结构:

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中,但没有成功。我甚至尝试修改DefaultCheckBoxNode的属性“setIcon”,但该组件没有该属性。因此,我问自己是否有解决问题的方法。

您可以创建一个图标,它是两个图标的组合,并排绘制,并在树节点上设置该图标。我不确定仅仅使用MatlabAPI是否可以做到这一点,但我的理解是,您可以直接在MATLAB中构造和使用Java对象,因此这两种方式都是可能的

似乎
setIcon()
方法接受的是Java
图像
对象,而不是
图标
对象。以下是创建合成图像的一般策略:

  • 创建一个具有适当宽度和高度的
    buffereImage
    对象以容纳两个图标
  • 使用
    buffereImage.createGraphics()
  • 使用
    Graphics2D.drawImage()

  • 并且可能对您有用。

    谢谢您的回答。然而,我不懂Java编程,很难找到解决方案。