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

Objekt erstellen und dessen Eigenschaften ändern

 

Laura2go
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.03.2012, 16:25     Titel: Objekt erstellen und dessen Eigenschaften ändern
  Antworten mit Zitat      
Hallo,

ich möchte gerne in meiner GUI mehrere uipanels erstellen und jeweils deren Attribute verändern können. Um mein Problem besser zu erläutern, habe ich hier ein kleines Beispiel aus meinem mfile:

Code:

uipanel('Tag','a1','Title','hello','Units','normalized','BackgroundColor',[1 1 0],'Position',[0.833 0.219 0.0924 0.106],'ButtonDownFcn',@dragObject);
 


Zunächst habe ich ein kleines Verständnisproblem. Wenn ich auf meinen Button klicke, dann wird wie gewünscht ein Panel erstellt. Beim nächsten klick wird erneut ein Panel erstellt. Wie kann das sein, dass zwei Objekte offensichtlich den selben Tag besitzen?

Mit einem anderen Button möchte ich nun das Attribut 'Title' ändern:
Code:
set(handles.a1,'Title','goodbye');

Dabei entsteht folgende Fehlermeldung:
??? Error while evaluating uicontrol Callback
??? Reference to non-existent field 'a1'.

Was mache ich falsch?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.03.2012, 17:07     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wie kann das sein, dass zwei Objekte offensichtlich den selben Tag besitzen?

Sinnvoll ist das sicher nicht. Ich würde aber sagen, dass es in der Verantwortung der Programmiererin liegt, die Tags passend zu wählen.
Willst du denn wirklich ein neues uipanel erstellen, oder was willst du?

Zitat:
Dabei entsteht folgende Fehlermeldung:
??? Error while evaluating uicontrol Callback
??? Reference to non-existent field 'a1'.

Es scheint, dass du GUIDE verwendest. Natürlich speichert GUIDE aber nur die Handles der Elemente, die auch in der .fig-Datei enthalten sind. Wenn du dynamisch neue Elemente erzeugst (womit ich sehr vorsichtig sein würde), musst du selbst sehen, dass die Handles gespeichert werden - z.B. indem du das Handle in die Handles-Struktur hinzufügst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2012, 10:51     Titel:
  Antworten mit Zitat      
Hallo Harald,

mein Ziel ist es n verschiedene Objekte und deren Verbindungen zueinander graphisch zu erstellen. Diese Objekte sollen beweglich sein (drag'n'drop) und man soll ihnen Werte zuweisen können (bsp: Objekt1 hat 2 Äpfel, Objekt2 5 Äpfel).

Meine Idee war das folgendermaßen zu realisieren:
- ich erstelle Panels als Objekte
- und Verbindungen mittels annotation('arrow')

Gibt es eine einfachere und sinnvollere Möglichkeit? Kann ich vielleicht solche Objekte über ActiveX Control erstellen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 05.03.2012, 11:49     Titel:
  Antworten mit Zitat      
Hey,

es gibt natürlich noch Alternativen. Vll interessiert dich folgende Seite

http://undocumentedmatlab.com/blog/jgraph-and-bde/

Beim beschriebenen Beispiel einfach
Code:

% ...
[obj,hcontainer] = javacomponent(mypanel,[0,0,pos(3:4)],f);
set(hcontainer,'units','normalized')
set(graphComponent,'DragEnabled','off')
 

einfügen und du kannst drag n drop nutzen... Allerdings müsstest du einige Zeit berücksichtigen, die du benötigst um dich mit der Bibliothek auseinander zu setzen. Die Doku ist nicht gerade umfangreich...

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2012, 15:24     Titel:
  Antworten mit Zitat      
Super! So etwas habe ich doch gesucht.

Die Grafik habe ich zumindest schon in die GUI bekommen indem ich folgendes geändert habe:
Code:
f = figure('units','pixels');
durch f=gcf;


Wie eigne ich mir am Besten die Bibliothek an? Habe so etwas noch nicht gemacht und weiß nicht, wie ich einen Überblick zu den Befehlen bekomme.

Leider habe ich es noch nicht geschafft per Klick ein Containier hinzuzufügen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 05.03.2012, 15:45     Titel:
  Antworten mit Zitat      
Hey,

Zitat:

Wie eigne ich mir am Besten die Bibliothek an? Habe so etwas noch nicht gemacht und weiß nicht, wie ich einen Überblick zu den Befehlen bekomme.

Es gibt ein Forum auf der Seite wo du das jar File runtergeladen hast. Zudem gibt es dort eine grobe Bedienungsanleitung. Da es sich um Java Programmierung handelt wirst du hier im Forum sicherlich nicht viel Antworten auf deine Fragen bekommen.

Eine Sache kann ich dir dennoch mit aufm Weg geben. Folgendermaßen kannst du ein Callback hinzufügen:
Code:

set(handle(graphComponent.getGraphControl(),'CallbackProperties'),'MouseClickedCallback',{@testCB,graphComponent})

function testCB(obj, evd, graphComponent)
% test
t = 1
 

Ich habe damit noch nicht ausgiebig gearbeitet und kann dir darum auch nicht mehr sagen. Nur, dass es besonders für Programmieranfänger ziemlich schwierig sein wird, sich dort zurecht zu finden. Aber wenn man die nötigen Informationen beisamen hat, kann man damit sicherlich einiges machen...

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2012, 21:05     Titel:
  Antworten mit Zitat      
Danke Marco. Arbeite gerade die Anleitung durch. Leider bezieht sich diese nicht auf Matlab und auch sonst findet man dazu nicht viel.

Kannst du mir noch verraten, wie ich beim genannten Beispiel die Variablen graph bzw. parent global einstellen kann. Mit handles hat es leider bei mir nicht funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 06.03.2012, 09:04     Titel:
  Antworten mit Zitat      
Hey,
Zitat:

Leider bezieht sich diese nicht auf Matlab und auch sonst findet man dazu nicht viel

Willkommen in der Java Welt. Da siehst du mal wie gut die Dokumentation in Matlab ist. Da ich am überlegen bin ob ich diesen Graph ebenfalls in meiner Software integriere, habe ich mir den Umstand gemacht ein einfaches Beispiel zu erstellen.
Code:

function testGraph
javaaddpath('jgraphx/lib/jgraphx.jar')

graph = javaObjectEDT('com.mxgraph.view.mxGraph');
parent = graph.getDefaultParent();
graph.getModel().beginUpdate;
v1 = graph.insertVertex(parent,'','Tag',240,150,80,30,'defaultVertex;fillColor=blue');
v2 = graph.insertVertex(parent,'','Nacht',20,20,80,30);
graph.insertEdge(parent, '','Edge',v1,v2);
graph.getModel().endUpdate();

menuItem_1 = handle(javaObjectEDT('javax.swing.JMenuItem','Insert Vertex'),'callbackProperties');
menuItem_2 = handle(javaObjectEDT('javax.swing.JMenuItem','Delete Object'),'callbackProperties');
menuItem_3 = handle(javaObjectEDT('javax.swing.JMenuItem','View Page'),'callbackProperties');

jpopupmenu = handle(javaObjectEDT('javax.swing.JPopupMenu'),'callbackProperties');
jpopupmenu.add(menuItem_1);
jpopupmenu.add(menuItem_2);
jpopupmenu.add(menuItem_3);
handles.jpopupmenu = jpopupmenu;

graphComponent = javaObjectEDT('com.mxgraph.swing.mxGraphComponent',graph);
graphComponent.setGridVisible(true);
graphComponent.setGridStyle(3)


pos = get(figure,'Position');
mypanel = javaObjectEDT('javax.swing.JPanel',java.awt.BorderLayout);
mypanel.add(graphComponent);
[obj,hcontainer] = javacomponent(mypanel,[0,0,pos(3:4)],gcf);
set(hcontainer,'units','normalized')
set(graphComponent,'DragEnabled','off')

% Callbacks definieren
set(handle(graphComponent.getGraphControl(),'CallbackProperties'),'MouseClickedCallback',{@MouseClickedCallback,gcf})
set(menuItem_1,'MousePressedCallback',{@CB_Insert_vertex,gcf});
set(menuItem_2,'MousePressedCallback',{@CB_Delete_object,gcf});
set(menuItem_3,'MousePressedCallback',{@CB_View_Page,gcf});

% handles Struct erstelles
handles.insertPos = [];
handles.SelObj = [];
handles.panel = handle(mypanel,'callbackProperties');
handles.graphComponent = handle(graphComponent,'callbackProperties');
handles.graph = handle(graph,'callbackProperties');
guidata(gcf,handles)
end

function MouseClickedCallback(obj, evd, fig)
% MouseClickedCallback
handles = guidata(fig);
SelObj = handles.graphComponent.getCellAt(evd.getX(), evd.getY());
if evd.isMetaDown && ~isempty(SelObj) % Maus rechtsklick und ein Objekt ist gewählt
    posX = evd.getX;
    posY = evd.getY;
    handles.jpopupmenu.show(obj, posX, posY);
    handles.jpopupmenu.repaint;
    handles.SelObj = SelObj;
    guidata(fig,handles)
elseif evd.isMetaDown % rechtsklick Maus
    posX = evd.getX;
    posY = evd.getY;
    handles.jpopupmenu.show(obj, posX, posY);
    handles.jpopupmenu.repaint;
    handles.SelObj = [];
    handles.insertPos = [posX,posY];
    guidata(fig,handles)
end
end

function CB_Insert_vertex(obj,evd,fig)
handles = guidata(fig);
if ~isempty(handles.insertPos)
    posX = handles.insertPos(1);
    posY = handles.insertPos(2);
    parent = handles.graph.getDefaultParent();
    handles.graph.getModel().beginUpdate;
    handles.graph.insertVertex(parent,'','Peter',posX,posY,80,30);
    pause(0.2) % wird benötigt für grafisches Update
    handles.graph.getModel().endUpdate;
    handles.insertPos = [];
    guidata(fig,handles)
end
end

function CB_Delete_object(obj,evd,fig)
handles = guidata(fig);
if ~isempty(handles.SelObj)
    handles.graph.getModel().beginUpdate;
    handles.graph.removeCells(handles.SelObj);
    pause(0.2) % wird benötigt für grafisches Update
    handles.graph.getModel().endUpdate;
    handles.SelObj = [];
    guidata(fig,handles)
end
end

function CB_View_Page(obj,evd,fig)
handles = guidata(fig);
if handles.graphComponent.isPageVisible
    handles.graphComponent.setPageVisible(false)
    pause(0.2)
    handles.graphComponent.repaint;
else
    handles.graphComponent.setPageVisible(true)
    pause(0.2)
    handles.graphComponent.repaint;
end
end
 

Die Methoden von den Javaobjekten kannst du dir mit
Code:

methods(DeinJavaObjekt)
 

anschauen. So kannst du einige Sachen setzen (wie z.B. das Grid) Viele davon sind selbsterklärend. Mit
Code:

get(DeinJavaObjekt)
 

bekommst du unter anderem alle möglichen Callbacks angezeigt, die du wie oben beschreiben benutzen kannst. Nicht erschrecken die Liste ist lang.

Weitere Fragen zum Graph werde ich nicht beantworten, da gomatlab ein Matlab Forum ist und kein Java Forum. Bitte schaue in den entsprechenden Foren nach Antworten oder probiere es einfach aus. Mit den oben beschreibenen Methoden hast du eine gute Basis dafür.

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 06.03.2012, 10:17     Titel:
  Antworten mit Zitat      
Sry hatte noch einene Fehler gemacht.
Erzeuge folgende Objekte bitte folgendermaßen:
Code:

graph = com.mxgraph.view.mxGraph;
graphComponent = com.mxgraph.swing.mxGraphComponent(graph);
 

Ohne javaObjectEDT. Dann sollte es gehen. Mit einem rechten mausclick sollte ein Menü erscheinen.

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2012, 14:20     Titel:
  Antworten mit Zitat      
Hallo Marco,

vielen Dank, dass du dir die Mühe gemacht hast! Genau so ein Beispiel habe ich gesucht!

Leider habe ich es dennoch nicht geschafft per Button (Matlab) ein Vertex zu erstellen, da die variable fig oder graph nicht gefunden werden. Aber ich werde es weiter versuchen Smile
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 - 2025 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.