Verfasst am: 19.04.2013, 14:46
Titel: Event und Listener definieren
Hallo,
ich möchte gern eine callback-Funktion definieren, die immer dann ausgeführt wird, wenn der Nutzer ein Plotfenster maximiert oder minimiert. Ob das Fenster maximiert ist bekomme ich mit
In der Matlab-Hilfe gibt es ein Beispiel für einen Property-Listener:
Code:
classdef PropLis < handle
% Define a property that is SetObservable properties(SetObservable)
ObservedProp = 1;
end methods function attachListener(obj)
%Attach a listener to a PropListener object
addlistener(obj,'ObservedProp','PostSet',@PropLis.propChange);
disp('listener created.') end end methods(Static) function propChange(metaProp,eventData) % Callback for PostSet event % Inputs: meta.property object, event.PropertyEvent
h = eventData.AffectedObject;
propName = metaProp.Name;
disp(['The ',propName,' property has changed.']) disp(['The new value is: ',num2str(h.ObservedProp)]) disp(['It''s defaul value is: ',num2str(metaProp.DefaultValue)]) end end end
Aber wenn ich jetzt versuche, die Klasse so anzupassen, dass sie auf die Maximierung des Fensters 'hört' scheitere ich:
Code:
classdef UserMaximizeWindow < handle
% Define a property that is SetObservable properties(SetObservable)
handle
end methods functionset.handle(obj, handle)
obs = 'get(get(handle, ''javaFrame''), ''Maximized'')';
%Attach a listener to a PropListener object
addlistener(obj,obs,'PostSet',@UserMaximizeWindow.propChange);
disp('listener created.') end end methods(Static) function propChange(metaProp,eventData) % Callback for PostSet event % Inputs: meta.property object, event.PropertyEvent
h = eventData.AffectedObject;
propName = metaProp.Name;
disp(['The ',propName,' property has changed.']) disp(['The new value is: ',num2str(h.ObservedProp)]) disp(['It''s defaul value is: ',num2str(metaProp.DefaultValue)]) end end end
Wenn ich der Klasse jetzt ein Figure-Handle zuweise funktionierts nicht:
Code:
fh=figure;
h=UserMaximizeWindow;
h.handle=fh
Error using UserMaximizeWindow/addlistener
The name 'get(get(handle, 'javaFrame'), 'Maximized')' is not an accessible property for an instance of class
'UserMaximizeWindow'.
Error in UserMaximizeWindow/set.handle(line10)
addlistener(obj,obs,'PostSet',@UserMaximizeWindow.propChange);
Ich verstehe auch noch nicht so ganz was du mit deinem Code bezwecken möchtest. Was auf jeden Fall funktioniert ist, wenn du die ResizeFcn deiner figure nutzt. Also z.B. so
Code:
function figure1_ResizeFcn(hObject, eventdata, handles) % hObject handle to figure1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) ifget(get(gcf, 'javaFrame'), 'Maximized')
d = 'maximized'
else
d = 'nicht maximized'
end
Wie Marco das bereits angedeuted hat hast du das mit den Listener
etwas missverstanden.
Listener funktionieren nur für Events, die ein Objekt freiwillig feuert
oder für bestimmte Properties ( observable ) einiger grafik-Objekte
oder deiner eigenen Objekte
Die Eigenschaften die du abhorchen willst (maximized/ minimized),
gehören aber zu einer Java-Klasse keine Listener unterstützt
(glaub mir da hab ich schon werweiswas versucht)
Die Lösung für dich sieht so aus:
Code:
f = figure;
j = get( f , 'javaframe' );
drawnow;
w = j.fHG1Client.getWindow();
set( w , 'WindowIconifiedCallback' , @(~,~)disp('WindowIconifiedCallback'));
set( w , 'WindowDeiconifiedCallback' , @(~,~)disp('WindowDeiconifiedCallback'));
vielen Dank für Eure Hilfe. Ja, ich dachte, man könnte sich Ereignisse selbst definieren ;-)
Ziel der Funktionalität: In der Figure ist u.a. ein Panel mit Buttons, das soll nach dem Maximieren so breit sein wie das Fenster, aber seine ursprüngliche Höhe behalten.
Durch aufmerksames Lesen der Matlab-Hilfe bin ich jetzt auf folgende Lösung gestoßen:
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.