我正试图在我的matlab代码中使用一些java gui。我想创建一个包含许多按钮的Jpanel,并将这个Jpanel添加到JscrollPane中,以便能够在Jpanel中上下、左右滚动。我尝试使用JavaComponent()函数,如中所述:http://undocumentedmatlab.com/blog/javacomponent
这是我的代码:
[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设置为可见,但没有结果。我错过了什么??
您只需要使用javacomponent
一次,就可以显示最外层的java容器,即JScrollPane
。只需在JPanel
容器中组装组件,然后将其传递给JScrollPane
构造函数。
请注意,使用javaObjectEDT创建对象更安全,这样后续的方法调用就可以在EDT上运行,否则可能会面临死锁/争用情况。
最后,请注意如何为javacomponent
创建的容器使用getpixelposition和'normalized'
单位,以使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
jscroll.add(jpanel1);
您不应该将组件添加到滚动窗格中。JScrollPane有自己的自定义布局管理器来显示滚动条和视口。
因此,您需要将面板添加到视口中:
jscroll.setViewportView( jpanel1 );
然而,这可能仍然不起作用,因为下面的代码看起来像是在试图设置组件的大小/位置,这意味着正在使用空布局:
set(hButton1,'position',[5 5 50 50])
通常,布局管理器负责确定组件的大小/位置,只有当面板的首选大小大于滚动窗格的大小时,才会显示滚动窗格的滚动条。
我不知道使用MatLab的好处是什么。我建议你只使用普通的Swing。请参阅Swing教程中关于使用布局管理器的示例。