2016-05-13 27 views
0

Ich versuche, einige Java-GUI in meinem Matlab-Code zu verwenden. Ich möchte ein Jpanel mit vielen Buttons erstellen und dieses Jpanel zu einem JscrollPane hinzufügen, um durch das Jpanel nach rechts und links blättern zu können. Ich versuchte JavaComponent() Funktion verwendet, wie beschrieben in: http://undocumentedmatlab.com/blog/javacomponentJscrollpane in Matlab

hier ist mein Code:

[jpanel1, hpanel1] = javacomponent('javax.swing.JPanel'); 
[jButton1, hButton1] = javacomponent('javax.swing.JButton'); 
[jscroll, hscroll] = javacomponent('javax.swing.JScrollPane'); 

jButton1.setText('Click again!'); 
set(hButton1,'position',[5 5 50 50]) 
set(hpanel1,'position',[50 50 500 500],'BackgroundColor','white'); 
jpanel1.add(jButton1); 
jscroll.add(jpanel1); 

Das Panel und Taste erstellt werden, aber ich kann die scrollpane nicht gefunden, versucht, die jscroll auf sichtbare Einstellung ohne Ergebnisse. WHat verpasse ich ??

Antwort

0

Sie müssen nur einmal javacomponent verwenden, um den äußersten Java-Container anzuzeigen, d. H. JScrollPane in Ihrem Fall. Stellen Sie Ihre Komponenten einfach in den Container JPanel und geben Sie diesen an den Hersteller JScrollPane weiter.

Beachten Sie, dass es sicherer ist, Ihre Objekte mit zu erstellen, damit nachfolgende Methodenaufrufe auf EDT - otherwise you could face a deadlock/race condition ausgeführt werden.

Schließlich ist zu beachten, wie Sie getpixelposition und 'normalized' Einheiten für den Behälter von javacomponent erstellt verwenden können Ihre JScrollPane füllt die gesamte Elternzeichenfläche, und verhalten sich besser auf der Größenänderung zu machen.

jButton1 = javaObjectEDT('javax.swing.JButton', 'Button 1'); 
jButton2 = javaObjectEDT('javax.swing.JButton', 'Button 2'); 
jPanel = javax.swing.JPanel(); 
jPanel.add(jButton1); 
jPanel.add(jButton2); 
jScrollPane = javax.swing.JScrollPane(jPanel); 

hFig = figure(); 
hParent = uicontainer('Parent',hFig); 
parentPixelPos = getpixelposition(hParent); 
pos = [1,1,parentPixelPos(3),parentPixelPos(4)]; % fill the parent uicontainer completely 
[~, hContainer] = javacomponent(jScrollPane, pos, hParent); 
set(hContainer, 'Units', 'normalized'); % better behavior on resizing 
+0

ok das macht Sinn. Vielen Dank –

0
jscroll.add(jpanel1); 

Sie sollten niemals Komponenten zu einem Bildlauffenster hinzufügen. Ein JScrollPane verfügt über einen eigenen benutzerdefinierten Layout-Manager zum Anzeigen der Bildlaufleisten und des Ansichtsfensters.

Anstatt also müssen Sie das Panel zu dem Darstellungsfeld hinzuzufügen:

jscroll.setViewportView(jpanel1); 

Dies kann jedoch immer noch nicht funktioniert, wie der folgende Code sieht aus wie es die Größe/Position des Bauteils zu setzen versucht, was bedeutet, ein null-Layout verwendet wird:

set(hButton1,'position',[5 5 50 50]) 

Normalerweise es in der Verantwortung des Layout-Managers ist die Größe/Position einer Komponente und die Bildlaufleisten des scrollpane nur ist die bevorzugte Größe des Panels angezeigt werden, zu bestimmen, größer als die Größe der sc Rollpane.

Ich weiß nicht, dass der Vorteil der Verwendung von MatLab ist. Ich schlage vor, Sie benutzen nur normalen Swing. Siehe Beispiele aus dem Swing-Tutorial unter Using Layout Managers.

+0

Ja, Sie haben Recht Layoutmanager verwenden ist viel einfacher. danke –