0

uitableは、matlab のボタンのコールバックでこのコードを使用する前に尋ねた問題を 解決するために、ここで
見たいものと同様の例でhtml コンテンツをサポートしていることがわかります。

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 でワークスペースを開くと、handles.tableData(handles.indexes,2) が文字列に設定されていることがわかります。
このhtmlコードが単純な文字列として表示されていなくても、背景色は変わりません。セルに変更はありません!!!
そしてmatlabはエラーメッセージを出さない!!!
このコードも使用しましたが、変更はありませんでした。

handles.tableData(handles.index,2)=cellstr('<html><span style="background-color:  #FF0000;"></span></html>');
4

2 に答える 2

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 アプローチは、小さなテーブルでは問題なく機能します。大きなテーブルの場合、または編集を有効にする場合は、より良い方法があります。Java Swing の知識が必要です。

于 2013-07-06T15:58:03.543 に答える
3

コードを比較します(読みやすくするために改行を追加しました-これらを「1行で」検討してください):

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>');

非常に重要な違いがあります。元のコードでは、色は 16 進数として定義されています (HTML がレンダリングされるときに解釈できます)。コードでは、color変数は Matlab に認識されていますが、tableData. また、HTML インタープリターは、それが発生したときに何をすべきかわからないcolor(1,1)ため、コマンド全体を黙って無視します。これを修正するには、最終的に得られる文字列が「意味がある」ことを確認する必要があります。つまりcolor、文字列に変換します。注 - 出力を見ると、uisetcolor返された値は と の間01はなく と の間0であることがわかりました255。したがって、最初に色の値に 255 を掛けます。

c255 = color(1,1:3)*255;
colorString = sprintf('rgb(%d,%d,%d)', c255);

この時点で、colorStringrgb(173,235,255)たとえば)です。

これで、フォーマット文字列全体を次のように作成できます

formatString = ['<html><span style="background-color: ' colorString ';"></span></html>'];

そして、あなたはそれを設定することができます:

handles.tableData(handles.index,2) = cellstr(formatString);
于 2013-06-18T22:00:00.043 に答える