2015-04-28 15 views
2

我想獲取對我在GUI中控件的底層java組件的引用,以便自定義它們的外觀。在matlab中獲取控件的底層java組件的快速方法

  • 我知道findjobj亞伊爾奧特曼它的作品真的很好:

    myLink = uicontrol('String', '<html><u>Button that looks like a link.</u></html>'); 
    jObj = findjobj(myLink); 
    jObj.setContentAreaFilled(0); 
    

    不幸的是這個解決方案是相當緩慢當有一個的控制來定製「批」(因爲它必須解析圖中對象的完整層次結構,並對每個控件進行自定義)。

    此外,圖形必須可見(否則控件未實例化,並且無法找到java引用)。另外,它必須被移動屏幕,以避免用戶在findjobj運行去觸摸它(有時把事情崩潰,因爲findjobj某種程度上依賴於控件的位置找到它們,同時內部還呼籲drawnow哪些更新位置)......

    在有些機器,即使只有少數幾個控件可以自定義,也可能需要10秒鐘才能顯示數字(大部分時間用於findjobj)。

  • 我也是從亞伊爾奧特曼不斷了解uicomponent直接創建控件和獲取句柄到底層Java組件在一個鏡頭:

    [myLink, jObj] = uicomponent('Style', 'JButton', 'String', '<html><u>Button that looks like a link.</u></html>'); 
    jObj.setContentAreaFilled(0); 
    

    遺憾的是這裏的parent屬性,只能是圖,當然我的控件放在容器中,以便很好地處理大小調整和其他許多事情(並且gui佈局包含器不是用於組件工作的有效hg句柄)...

所以想知道是否可以有任何其他快速解決方案爲我的GUI中的控件獲取底層Java組件? ...注:我主要只需要有看起來像超鏈接或動畫gif的按鈕(即帶有htlm text/img的無邊框按鈕)。

回答

1

這不是對您的問題的直接回答,但我已經構建了幾個基於GUI佈局工具箱幷包含Java swing組件的GUI。我通常會安排一些東西,以便GUI佈局容器(HBox,VBox,Grid等)具有uipanel作爲子項,然後uipanel將Java swing組件作爲子項。

通常,您可以將一個Java組件父項添加到uipanel,方法與將其父母添加到一個圖形(與GUI佈局容器不同)的方式完全相同,將uipanel父項設置爲GUI佈局容器也沒關係。

因此,例如,添加一個按鈕,下拉菜單(無菜單項,所以它不會做任何事情,但只是爲了說明):

>> u = uipanel; 
>> ddbuttonclass = 'com.mathworks.widgets.DropdownButton'; 
>> ddbutton = javaObjectEDT(ddbuttonclass); 
>> [jddbutton, hjddbutton] = javacomponent(ddbutton, [30,30, 60, 30], u); 

現在你可以父u到GUI佈局容器,並且您可以完成所有不錯的大小調整。

我不熟悉Yair的uicomponent,但是如果你能以某種方式得到java組件的句柄,你應該可以使用類似上面的東西。

PS如果您想要他的直接輸入,@Yair有時會活動 -​​ 他可能會收到通知,如果我提到他的名字。如果你正在做很多Java/MATLAB GUI工作,我還建議購買他的book

+0

我還看不出有'javacomponent'自動調整其包裝'uipanel'做了'uiextras內。 (看我的[測試代碼](https://gist.github.com/CitizenInsane/0dccb5d8b7bbf389bbe8)),但這看起來像是一個很好的方向。在驗證您的答案之前,我需要更深入地瞭解這一點,但會讓您知道。非常感謝。 – CitizenInsane

+0

引用你的測試代碼:從'javacomponent'返回第二個輸出參數,即做'[jBtn,hjBtn] = javacomponent(...'。這個額外的輸出參數給出'jBtn'的句柄包裝,然後'set hjBtn,'Units','normalized')'這樣,我就可以獲得我想要的調整行爲 –

+0

謝謝你們,它像一個魅力,我肯定需要購買@yair的書現在。 – CitizenInsane

1

UICOMPONENT被設計成可以直接替換Matlab內置的UICONTROL和JAVACOMPONENT函數。這意味着您可以直接在面板中放置UICOMPONENT,甚至可以在GUI佈局工具箱中創建UICOMPONENT。

您可能需要一些Matlab的版本中投佈局面板的手柄增加一倍(double(hPanel)),但僅此而已:

[myLink, jObj] = uicomponent('Parent',hPanel, ...); 
[myLink, jObj] = uicomponent('Parent',double(hPanel), ...); % on some Matlab releases 

你也可以直接使用JAVACOMPONENT,但它並沒有真正給你任何因爲UICOMPONENT在底層使用JAVACOMPONENT,並且還增加了重要的功能(例如確保組件放置在EDT上,並且從Matlab包裝器合併重要屬性)。

至於FINDJOBJ,可以使用參數'class'指定目標對象類來加快速度。但是如果你的數字包含數百個控件,它可能仍然很慢。直到今天,在我的第一個FINDJOBJ版本接近10年後,我仍然不知道直接獲取底層Java對象的方法。我假設有一個由MathWorks內部使用,但我不知道。

正如@SamRoberts提到的,這是在我的書都討論...

相關問題