Bonjour à tous,
Je participe au développement d'un outil sous Matlab R2013b (désolé, la MàJ n'est pas possible dans mon cas) et j'aide au développement de son interface graphique.
Je cherche utiliser une uitable, mais comme il n'existe pas beaucoup d'options sous Matlab pour la mettre en forme, j'utilise entre autre findjobj.
Mon objectif est que sa taille s'adapte à mes données, qu'elle soit placée de manière "normalisée" (ie Position décrite avec les coordonnées en pourcentage et non pas en nombre de pixels), et que celle-ci s'adapte à la modification de la taille de la fenêtre par l'utilisateur.
J'ai rencontré quelques soucis, et j'ai donc du bricoler un peu pour arriver au résultat souhaité : comme l'adaptation aux données ne semble fonctionner qu'avec les coordonnées par pixel, je suis obligé de rebasculer sur des coordonnées "normalisées" pour mon placement dans la fenêtre), et l'adaptation à la modification de la fenêtre est réalisée par l'appel à findjobj.
Je récupère alors une erreur lors de l'utilisation de l'objet renvoyé par findjobj :
Mon gros problème est que cela se passe différemment en debugging... Et encore, je n'arrive pas toujours à comprendre quand cela marche ou pas... En tout cas, quand je lis les lignes pas à pas, tout fonctionne, mais dès que je lis tout d'un coup, cela ne fonctionne plus. D'ailleurs, j'observe pour mon interface graphique qu'elle s'affiche différemment quand cela bugue, l'adaptation de la taille au donnée ne se fait pas bien, comme si elle était passée en système de coordonnées normalisées avant d'avoir réalisé le recadrage...No appropriate method, property, or field getViewport for class
javahandle_withcallbacks.com.mathworks.hg.peer.HeavyweightLightweightContainerFactory$UIComponentLightweightContainer.
Error in myJobGUI/InitMainFig (line 4805)
jTable = jscroll.getViewport.getView;
Au cours de mes recherches, j'ai lu que l'allocation des ressources étaient differentes en mode debugging... Je me suis donc dit que cela venait de là, mais aucune idée de la raison profonde de mon problème... Pour information, cela n'a rien à voir avec les autre fichiers .mat, car le problème appairait lorsque je lance simplement le script de mon interface.
Voici ci-dessous le bout de code qui pose problème, inséré ici dans une classe simplifiée (normalement, mon uitable est insérée dans plusieurs Panels). Il est intéressant de noter que ce bout de code fonctionne parfaitement, mais bugue dès qu'il est insérré dans mon interface principale; ce qui me conforte dans cette histoire d'allocation des ressources.
Auriez-vous des idées quant à la source du problème ? Ou une manière différente de répondre à mes contraintes graphiques plus... robuste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 classdef GUI_test < handle properties version = 0000000; % GUI state related members gui_state = []; % GUI handles gui_handles = []; end % end of properties methods function self = GUI_test(self) InitMainFig(self); end end methods (Access = private) function self = InitMainFig(self) self.gui_handles.MainFig = figure( ... 'Units', 'normalized', ... 'Position', [0.1 0.1 0.4 0.4], ... 'MenuBar', 'none', ... 'Name', 'my GUI',... 'NumberTitle', 'off') values={'0.5','42 %';'0.7','28 %'}; rnames = {'Title 1','Title 2'}; cnames = {'Field 1','Field 2'}; self.gui_handles.FinalValuesTable_SVSTM = uitable( ... 'Parent', self.gui_handles.MainFig, ... 'Data',values, ... 'FontSize', 12, ... 'FontWeight', 'bold', ... 'FontName','FixedWidth', ... 'ColumnName', cnames, ... 'RowName', rnames, ... 'Position', [1 1 400 100]); % à partir d'ici, cela ne fonctionne que si je lis le script pas à pas... % adapter la taille du tableau aux données extendpanel=get(self.gui_handles.FinalValuesTable_SVSTM,'Extent'); set(self.gui_handles.FinalValuesTable_SVSTM,'Position',extendpanel); % positionner le tableau de façon "normalisée" set(self.gui_handles.FinalValuesTable_SVSTM,'Units','normalized'); positionpanel=get(self.gui_handles.FinalValuesTable_SVSTM,'Position'); positionpanel(1)=0.01; positionpanel(2)=0.07; set(self.gui_handles.FinalValuesTable_SVSTM,'Position',positionpanel); % modifier la fenêtre de façon à ce qu'elle soit flexible % lorsqu'on change la taille de la fenêtrer jscroll=findjobj(self.gui_handles.FinalValuesTable_SVSTM); jTable = jscroll.getViewport.getView; %erreur dans mon vrai code jTable.setAutoResizeMode(jTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); end end end
Merci d'avance !
Bonne journée.
Partager