2016-05-13 59 views
0

我想在我的matlab代码中使用一些Java gui。 我想创建一个包含大量按钮的Jpanel,并将此Jpanel添加到JscrollPane以便能够上下左右滚动浏览Jpanel。 我尝试使用JavaComponent()函数中所述:http://undocumentedmatlab.com/blog/javacomponentJscrollpane in matlab

这里是我的代码:

[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); 

面板和按钮创建,但我找不到滚动面板,尝试设置jscroll可见没有结果。 我错过了什么?

回答

0

您只需要使用javacomponent一次,以显示最外面的java容器,即JScrollPane您的情况。只需在JPanel容器内组装您的组件,然后将其传递给JScrollPane构造函数。

请注意,使用javaObjectEDT创建对象比较安全,以便后续方法调用可在EDT - otherwise you could face a deadlock/race condition上运行。

最后,注意你如何使用getpixelposition'normalized'单位通过javacomponent创建,使您的JScrollPane填充整个父绘图区域,和行为上的调整更好的容器。

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

好吧,这是有道理的。谢谢 –

0
jscroll.add(jpanel1); 

您不应该将组件添加到滚动窗格。 JScrollPane具有自己的自定义布局管理器来显示滚动条和视口。

因此,你需要将面板添加到视域:

jscroll.setViewportView(jpanel1); 

然而,这可能仍然无法正常工作,下面的代码看起来是尝试设置,这意味着该组件的大小/位置空布局正在使用:

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

一般而言,这是布局管理器的责任,以确定一个部件的尺寸/位置和将只显示滚动面板的滚动条是面板的优选大小是大于sc的大小rollpane。

我不知道使用MatLab的好处是。我建议你只使用普通的Swing。请参阅Using Layout Managers上Swing教程的示例。

+0

是的,你是对的使用布局管理器更容易。谢谢 –