matlab中的Jscrollpane

Jscrollpane in matlab

我正在尝试在我的 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 设置为可见但没有结果。 我错过了什么??

jscroll.add(jpanel1);

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

所以您需要将面板添加到视口:

jscroll.setViewportView( jpanel1 );

但是,这可能仍然不起作用,因为以下代码看起来像是在尝试设置组件的 size/location,这意味着正在使用空布局:

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

通常情况下,布局管理器有责任确定组件的 size/location,滚动窗格的滚动条只会在面板的首选大小大于滚动窗格的大小时显示.

我不知道使用 MatLab 的好处是什么。我建议你只使用普通的 Swing。请参阅 Using Layout Managers.

上的 Swing 教程中的示例

您只需使用 javacomponent 一次,即可显示最外层的 java 容器,即您的 JScrollPane。只需 assemble 您的组件在 JPanel 容器中,然后将其传递给 JScrollPane 构造函数。

请注意,使用 javaObjectEDT so that subsequent method calls run on EDT - otherwise you could face a deadlock / race condition 创建对象更安全。

最后,请注意如何为 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