我们知道uitable支持html内容
有关我想要的示例,请参阅here
解决我在使用matlab中的按钮回调之前使用此代码之前询问的problem:
color = uisetcolor;
numberOfClasses = str2num(get(handles.edtNumClass,'String'));
if handles.index == 0
handles.tableData = cell(numberOfClasses,2);
guidata(hObject,handles);
end
handles.index = handles.index+1;
handles.tableData(handles.index,1)=cellstr(get(handles.edtNameClass,'String'));
handles.tableData(handles.index,2)=cellstr('<html><span style="background-color: rgb(color(1,1),color(1,2),color(1,3));"></span></html>');
set(handles.uitable2,'data',handles.tableData);
我的问题是这行不起作用:
handles.tableData(handles.index,2)=cellstr('<html><span style="background-color: rgb(color(1,1),color(1,2),color(1,3));"></span></html>');
我的意思是当我在matlab中打开工作区时,我看到handle.tableData(handles.indexes,2)被设置为字符串。
但背景颜色不会改变
即使这个HTML代码也不会显示为简单的字符串。
电池没有变化!!!
和matlab没有给出错误信息!!!
请注意,我甚至使用了此代码,但没有任何变化。
handles.tableData(handles.index,2)=cellstr('<html><span style="background-color: #FF0000;"></span></html>');
答案 0 :(得分:5)
@Floris是正确的,字符串不是“评估”为MATLAB代码,需要显式写入颜色。这是一个小例子:
%# data
X = {
'Alice' 1
'Bob' 2
'Charlie' 3
'Dave' 4
};
%# get color from user
c = uisetcolor();
%# format color as: rgb(255,255,255)
%#clr = sprintf('rgb(%d,%d,%d)', round(c*255));
%# format color as: #FFFFFF
clr = dec2hex(round(c*255),2)'; clr = ['#';clr(:)]';
%# apply formatting to third row first column
X(3,1) = strcat(...
['<html><body bgcolor="' clr '" text="#FF0000" width="100px">'], ...
X(3,1));
%# display table
f = figure('Position',[100 100 350 150]);
h = uitable('Parent',f, 'ColumnWidth',{100 'auto'}, ...
'Units','normalized', 'Position',[0.05 0.05 0.9 0.9], ...
'Data',X, 'ColumnName',{'Name','Rank'}, 'RowName',[]);
注意:我尝试了一些HTML代码的变体。问题是背景颜色仅应用于文本但未填充整个表格单元格:
<html><span style="background-color: #FFFF00; color: #FF0000;">
<html><font style="background-color: #FFFF00; color: #FF0000;">
<html><table cellpadding="0" width="100px" bgcolor="#FFFF00" style="color: #FF0000;"><tr><td>
最后一个有效,但它并不比我之前的代码更好。我尝试了其他CSS技巧来填充整个单元格空间,但失败了。我认为Java Swing组件支持的HTML / CSS子集是有限的。
以上HTML approach适用于小型表格。对于较大的表格或想要启用编辑时,有一个better approach。它需要熟悉Java Swing。
答案 1 :(得分:3)
比较你的代码(为了便于阅读,我添加了换行符 - 考虑这些“在一行上”):
handles.tableData(handles.index,2)= ...
cellstr('<html>
<span style="background-color: rgb(color(1,1),color(1,2),color(1,3));">
</span></html>');
使用链接中的代码
XX(idx,1) = strcat(...
'<html><span style="color: #FF0000; font-weight: bold;">', ...
XX(idx,1), ...
'</span></html>');
有一个非常重要的区别。在原始代码中,颜色被定义为十六进制数(可以在呈现HTML时解释)。在您的代码中,Matlab知道color
变量 - 但在创建tableData
时它被视为字符串。 HTML解释器在遇到color(1,1)
时不知道该怎么做,所以它默默地忽略了整个命令。要解决此问题,您需要确保最终的字符串“有意义” - 即将color
转换为字符串。注意 - 当我查看uisetcolor
的输出时,似乎返回的值介于0
和1
之间,而不是0
和255
之间;所以你想先将颜色值乘以255:
c255 = color(1,1:3)*255;
colorString = sprintf('rgb(%d,%d,%d)', c255);
此时,colorString
为rgb(173,235,255)
(例如)。
现在您可以将整个格式字符串创建为
formatString = ['<html><span style="background-color: ' colorString ';"></span></html>'];
你可以设置它:
handles.tableData(handles.index,2) = cellstr(formatString);