WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Event und Listener definieren

 

Sigggi
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 27.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2013, 14:46     Titel: Event und Listener definieren
  Antworten mit Zitat      
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
Code:

ismax = get(get(gcf, 'javaFrame'), 'Maximized');
 

heraus.

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
      function set.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 (line 10)
         addlistener(obj,obs,'PostSet',@UserMaximizeWindow.propChange);
 

Können hier nur Variablen ausgewertet werden? Eigentlich müsste ja auf die Abfrage von
Code:

get(get(gcf, 'javaFrame'), 'Maximized')
 

gelauscht werden. Wie mach' ich das nur?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
Verschoben: 19.04.2013, 16:54 Uhr von denny
Von Programmierung nach Objektorientierte Programmierung


Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 19.04.2013, 23:14     Titel:
  Antworten mit Zitat      
Hey,
es ist schon n bisl her, dass ich mit den listenern rumgespielt habe, aber bei dir ist die definition schon falsch
Code:

addlistener(obj,obs,'PostSet',@UserMaximizeWindow.propChange)
 

obs sollte der Propertiename sein also
Code:

addlistener(obj,'handle','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)
if get(get(gcf, 'javaFrame'), 'Maximized')
    d = 'maximized'
else
    d = 'nicht maximized'
end
 


Greetings

Nachtrag:
Achja falls es dich interessiert, du kannst auch listener auf figures anwenden (vll wolltest du ja soetwas machen)...
Code:

function testlis
f = figure;
addlistener(f,'Position','PreSet',@check_cb);

function check_cb(obj,evd)
pos = get(evd.AffectedObject,'Position'); % Guiposition
get(get(evd.AffectedObject, 'javaFrame'), 'Maximized')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 20.04.2013, 22:03     Titel:
  Antworten mit Zitat      
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') );



weitere Fragen jederzeit gern


Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
Sigggi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 27.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2013, 07:12     Titel:
  Antworten mit Zitat      
Hallo Marco, hallo Blues,

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:

Code:

fh = figure;
set(fh,'ResizeFcn',@mytestcallback)
 


und

Code:

function mytestcallback(hObject, Arg)
disp('callback executes')
 


Vielen Dank Euch beiden. Wenn die Funktionalität fertig ist, kann ich sie gern hier posten.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 22.04.2013, 07:46     Titel:
  Antworten mit Zitat      
Jup die Resize-Funktion ist Standardmatlab.

Minimize/ Maximize hingegen ist eine undokumentierte Funktion
(wie das mit dem "javaframe" übrigens auch)

2 Tips:
====


1. Bei der nächsten Anfrage so genau wie möglich angeben was dein eigentliches Ziel ist

2. die Funktion "get()" mal auf Figures, Axes, Plots usw. anwenden und ein bisschen erkunden was passiert. Da gibt es viel nützliches zu entdecken


Code:


oder

Code:



Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 22.04.2013, 07:54     Titel:
  Antworten mit Zitat      
Kleiner Nachtrag:

auf Matlab File Exchange gibt es eine "Layout-Toolbox" die kann genau was du suchst:

http://www.mathworks.com/matlabcent...../27758-gui-layout-toolbox

Und hier ein Code-Beispiel:

Code:
figure;
v = uiextras.VBox;
uiextras.Empty( 'Parent' , v );
contentPanel = uipanel( 'Parent' , v , 'Backgroundcolor' , 'red' );
uiextras.Empty( 'Parent' , v );
set( v , 'Sizes' , [ 1  200 1 ] );
figure;
v = uiextras.VBox;
uiextras.Empty( 'Parent' , v , 'BackgroundColor' , 'green' );
contentPanel = uipanel( 'Parent' , v , 'BackgroundColor' , 'red' );
uiextras.Empty( 'Parent' , v  , 'BackgroundColor' , 'green' );
set( v , 'Sizes' , [ -1  200 -1  ] );



Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.