[英]Expandable component to hide or unhide another component
我想知道是否有一個可以擴展的Swing組件,這樣我就可以隱藏或取消隱藏菜單之類的東西。
舉個例子,可以在MS Outlook中找到類似的東西:
這是默認外觀,其中所有郵件文件夾都被取消隱藏。 但點擊小箭頭(帶圓圈的紅色)隱藏了該視圖:
我希望在我的Java-GUI中有類似的東西來做同樣的事情,而默認情況下隱藏包含的組件。 我不確定哪個組件應該在那個可擴展的“tab”下面,但是現在我正在考慮一個JTree。
這是我一般的嘗試。 但是如果你想要一個獎金,你可以考慮這個可擴展菜單必須以流暢,流暢的動畫展開的要求,而不是立即隱藏或取消隱藏。 例如,后者可以在TeamViewer中找到。 在那里你有一個頂部的菜單欄,可以隱藏或取消隱藏,同時它以平滑的動畫上下移動。
示例,TeamViewer:
編輯
首先我嘗試了JSplitPane
,但是移動所有現有組件以適應拆分窗格架構並不是我想要的解決方案。 相反,我正在尋找更獨立的東西。
我嘗試的下一件事是使用Swing Timer
使用setBounds
-method擴展JFrame
的寬度。 當切換菜單的額外空間時,它完全按照我想要的方式工作。 在調整大小過程動畫時, JFrame
會變大或變小。 但我可以看到這種方法的兩個缺點:
為了讓我更清楚“黑色空間”的含義,請參閱:
現在你可以看到黑色區域。 就像我說的那樣,它只能保持半秒甚至更短。 使用Swing Timer,我在JFrame的寬度上添加了100個像素。 我添加到寬度的值越高,黑色區域越高。 如果JFrame
的寬度已完全調整大小,則所有內容的顏色都會再次正確。
所以有人知道為什么會這樣嗎? 這個硬件是相關的還是僅僅是Java或Swing的標准行為? 有誰知道這方面的解決方案或解決方法?
在我的問題的編輯部分中可以找到最適合我的解決方案。 我發現延遲時間和幀大小調整的良好組合看起來足夠平滑(1毫秒延遲並增加寬度,45像素)。 黑框的問題不再是問題。 現在黑屏的持續時間更短,如果用戶等待大約2秒,黑色區域將根本不顯示(可見)。 在那種情況下,對我來說沒關系,因為用戶應該在擴展之后花幾秒鍾。
對於想要在調整JFrame大小時了解更多關於此黑色區域的所有人,請參閱此處 。
我在編輯過的問題中描述的解決方案的代碼:
final Timer timer = new Timer(1, null);
timer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt)
{
double width = myFrame.getBounds().getWidth();
if(isExpanded == false)
width += FRAME_PIXEL_CHANGE;
else
width -= FRAME_PIXEL_CHANGE;
if(myFrame.getBounds().getWidth() >= FRAME_SIZE_EXPANDED && isExpanded == false)
{
myFrame.setBounds(FRAME_X, FRAME_Y, FRAME_SIZE_EXPANDED, FRAME_HEIGTH);
btnExpand.setIcon(new ImageIcon(GUI.class.getResource("/img/close.png")));
timer.stop();
isExpanded = true;
}
else if(myFrame.getBounds().getWidth() <= FRAME_SIZE_REGULAR && isExpanded == true)
{
myFrame.setBounds(FRAME_X, FRAME_Y, FRAME_SIZE_REGULAR, FRAME_HEIGTH);
btnExpand.setIcon(new ImageIcon(GUIMain.class.getResource("/img/expand.png")));
timer.stop();
isExpanded = false;
}
else
{
myFrame.setBounds(FRAME_X, FRAME_Y, (int) width, (int) FRAME_HEIGTH);
btnExpand.setBounds((int) (width-36), 246, 36, 36);
}
}
});
return timer;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.