Я пытаюсь использовать java gui в своем коде Matlab. Я хочу создать 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 на видимый, но без результатов. Что я упускаю ??

0
Oussama Kotegaeshi 13 Май 2016 в 21:31

2 ответа

Лучший ответ

Вам нужно использовать javacomponent только один раз, чтобы отобразить самый внешний контейнер java, то есть JScrollPane в вашем случае. Просто соберите компоненты внутри контейнера JPanel, а затем передайте его конструктору JScrollPane.

Обратите внимание, что безопаснее создавать объекты с помощью javaObjectEDT, чтобы последующий метод вызовы выполняются в EDT - в противном случае вы можете столкнуться с тупиковой ситуацией / гонкой .

Наконец, обратите внимание, как можно использовать единицы 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
1
nirvana-msu 13 Май 2016 в 21:39
jscroll.add(jpanel1);

Никогда не добавляйте компоненты в область прокрутки. JScrollPane имеет собственный диспетчер настраиваемого макета для отображения полос прокрутки и области просмотра.

Поэтому вместо этого вам нужно добавить панель в область просмотра:

jscroll.setViewportView( jpanel1 );

Однако это может по-прежнему не работать, поскольку следующий код выглядит так, как будто он пытается установить размер / расположение компонента, что подразумевает использование пустого макета:

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

Обычно за определение размера / расположения компонента отвечает менеджер по расположению, и полосы прокрутки области прокрутки будут отображаться только в том случае, если предпочтительный размер панели больше, чем размер области прокрутки.

Я не знаю, в чем преимущество использования MatLab. Я предлагаю вам просто использовать обычный Swing. См. Примеры из учебника Swing по Использование диспетчеров макета.

0
camickr 13 Май 2016 в 19:16