2

入力に​​uitablesを使用する MATLAB の GUI があります。固定数の列があり、各列には次のようにセル配列として保存した非常に特定の形式があります。

columnformat = {'text', 'numeric', {@doSomething, inputArg1}, {'Option1' 'Option2'}};

行数は理論上無制限です。ユーザーは好きなだけ提供できます。バックエンドは、任意の数の行入力を処理できます。現在、私は最初に大きな uitable を構築していますが、ユーザーがそれをすべて使用するわけではないと仮定しています。

質問は次のとおりです。ユーザーが最後の行を選択して Enter キーを押すたびに、テーブルの残りの部分と同じ形式で新しい行が作成されるように、テーブルと関連するコードを設定したいと考えています。

「データ」を動的に設定するなど、さまざまなアプローチを試しましたが、それらはすべて、セル配列によって指示されたカスタムフォーマットを壊しているようです。誰かが以前にこれを行ったことがあると確信しています。ご協力いただきありがとうございます!

4

2 に答える 2

2

このソリューションは、 を使用して作成された GUI で機能しMATLAB GUIDEます。MATLAB GUI が奇妙な動作を示すのは事実だと思いますが、MATLAB コールバックを のようなものを使用してデバッグkeyboardし、dbquit. したがって、私のアドバイスは、 で作成された MATLAB GUI にキーボード関連のコマンドを使用しないようにすることですGUIDE

さて、問題の解決に戻り、次の手順に従ってください。

ステップ 1:これを GUINAME__OpeningFcn の先頭に追加します。

handles.row_col_prev = [1 1];

ステップ 2:コンテキスト内のテーブルのプロパティをクリックし、 をクリックしますCellSelectionCallback。したがって、テーブルのタグが の場合、uitable1- という名前の関数が作成されますuitable1_CellSelectionCallback

GUIの図にタグがあると仮定すると -addrows_figure

これらを追加します。

%%// Detect the current key pressed
currentkey = get(handles.addrows_figure,'CurrentCharacter')

%%// Read in previous row-col combination
prev1 = handles.row_col_prev

%%// Read in current data. We need just the size of it though.
data1 = get(handles.uitable1,'Data');

%%// Main processing where a row is appended if return is pressed
if numel(prev1)~=0
    if size(data1,1)==prev1(1) & currentkey==13 %%// currentkey==13 denotes carriage return in ascii
        data1(end+1,:) = repmat({''},1,size(data1,2)); %%// Append empty row at the end 
        set(handles.uitable1,'Data',data1); %%// Save it back to GUI
    end
end

%%// Save the current row-col combination for comparison in the next stage
%%// when selected cell changes because of pressing return
handles.row_col_prev = eventdata.Indices;
guidata(hObject, handles);

これがうまくいくことを願っています!

于 2014-04-26T17:25:59.260 に答える
1

特定のキーで目的を達成する可能性は考えられませんでした。どのキーでも可能だと思います ( KeyPressFcn)。しかし、プッシュボタン付きのツールバーを導入することをお勧めします。

h = figure(...
u = uitable(h, ...
set(u,'Tag','myTable')
tbar = uitoolbar(h);
uipushtool(tbar,'ClickedCallback',@addRow);

コールバック関数では、データを取得し、行を追加して書き戻す必要があります。

function addRow(~,~)

u = findobj(0,'Type','uitable','Tag','myTable');
data = get(u,'Data');
%// modify your data, add a row ...
set(src,'Data',data);

end

すべてが少し単純でテストされていない場合は申し訳ありませんが、良い答えを得るにはかなりの労力が必要です。時間がありません。タグを使用すると、さらに多くのアイデアを得ることができます。

于 2014-04-26T10:01:46.873 に答える