0

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

4

2 回答 2

1

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

请注意,使用javaObjectEDT创建对象更安全,以便后续方法调用在 EDT 上运行 -否则您可能会遇到死锁/竞争情况

最后,请注意如何使用getpixelposition'normalized'units 创建的容器javacomponentJScrollPane填充整个父绘图区域,并在调整大小时表现得更好。

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
于 2016-05-13T21:39:16.657 回答
0
jscroll.add(jpanel1);

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

因此,您需要将面板添加到视口:

jscroll.setViewportView( jpanel1 );

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

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

通常,布局管理器负责确定组件的大小/位置,只有在面板的首选大小大于滚动窗格的大小时,才会显示滚动窗格的滚动条。

我不知道使用 MatLab 的好处是什么。我建议你只使用普通的 Swing。请参阅 Swing 教程中有关使用布局管理器的示例。

于 2016-05-13T19:16:53.740 回答