2014-04-23 57 views
0

我很難正確設置擺動組件在調整大小時的行爲方式。Java UI:在調整大小時設置擺動組件行爲

我有兩個問題與該接口: expected

答:在每一行開頭的切換按鈕是這裏摺疊/展開文本。所有元素都包含在JLayeredPane中。點擊按鈕後,我編輯窗格的高度以展開或摺疊內容(31或310)。 Expand正常工作推動下面的元素。另一方面,collapse確實隱藏了文本,但將所有元素留在原地。這裏是我的代碼:

private void expandText(java.awt.event.ActionEvent evt) { 
    JToggleButton button = (JToggleButton) evt.getSource(); 
    Container parent = button.getParent(); 
    Dimension size = parent.getSize(); 
    String icon; 

    if (button.isSelected()) { 
     size.height = 310; 
     icon = "/org/cytoscape/ocsana/resources/images/minus.png"; 
    } else { 
     size.height = 31; 
     icon = "/org/cytoscape/ocsana/resources/images/plus.png"; 
    } 

    parent.setSize(size); 
    try { 
     button.setIcon(new ImageIcon(ImageIO.read(getClass().getResource(icon)).getScaledInstance(-1, 15, Image.SCALE_SMOOTH))); 
    } catch (IOException ex) { 
    } 

    backgroundPane.revalidate(); 
    backgroundPane.repaint(); 
} 

B:上面的屏幕截圖是窗口的最小尺寸。當我水平調整窗口大小時,內部窗格僅調整爲min + (frame.width - min)/2的值,這意味着右側滾動條不會粘到框架的右側。

見的這兩個問題的演示如下: result

+0

關於B點:設置我的'backgroundPane'的大小和我的幀(由'JScrollPane',其大小現在設置得含)解決了這個問題。 – Florent

回答

0

根據camickr answer和評論,看我怎麼解決它:


A點是由於我在NetBeans中使用自由佈局。我沒有成功修復我的代碼,所以我改變了我的元素的結構。它可能不是最優的,並沒有把所有的擺動概念都用到正確的位置上,但它的工作方式是我想要的。

在使用GridBagLayout的背景中,我有一個JLayeredPane。此背景窗格包含高度爲30和260的一列JPanel,其中一個爲彙總行,另一個爲詳細信息

​​

通過隱藏下面面板belowPanel.setVisibility(false)JToggleButton作品控制的展開/摺疊的功能。無需重新包裝或任何東西,就是這樣。這是怎樣的代碼看起來像在不改變按鈕的圖標:

private void inverseVisibility(JToggleButton expand, JPanel target) { 
    if (expand.isSelected()) { 
     target.setVisible(true); 
    } else { 
     target.setVisible(false); 
    } 
} 

正如我只希望元素水平調整,我的所有面板都HorizontalFill值和NorthwestAnchor。我已經設置了weightX = 1; weightY = 0。最後,我在底部添加了一個面板,其中有一個Southwest錨點,並填充了both以及兩個權重到1(不確定它是否會改變任何內容,但這種方式我確信它會填充底部的所有空白區域,窗口大小調整爲比其內容更大的尺寸)。


B點已經通過以我的背景板,是適合我的Frame,並把它變成一個JScrollPane解決。我遇到的錯誤是由於Netbeans編輯器沒有正確地將滾動窗格粘貼到框架的側面,這是由於框架和滾動窗格中定義的大小不一致。如果你使用這個工具,我的建議是儘可能設置最少的值,因爲很多值都是由gui設計師密切關聯的。

Get the full code(95864個字節)

0

請問你展開/摺疊代碼工作?你只是讓組件可見/不可見,或者你是否從面板添加刪除組件?

另一方面,摺疊確實會隱藏文本,但會將所有元素留在原位。

如果添加/刪除組件,然後基本代碼:

panel.remove(...); 
panel.add(...); 
panel.revalidate(); 
panel.repaint(); 

意味着我右邊的滾動條不沾框的右側。

這取決於您使用的佈局管理器。我想最簡單的就是使用GrigBagLayout。它允許您「填充」可用空間。有關更多信息和示例,請參閱How to Use GridBagLayout上的Swing教程部分。

所有元素都包含在JLayeredPane中。

不確定您爲什麼使用分層窗格。默認情況下,分層窗格不使用佈局管理器。

+0

關於A點:我編輯了我的帖子以包含代碼。我已經添加了'int i = backgroundPane.getIndexOf(parent); backgroundPane.remove(ⅰ); backgroundPane.add(parent,i);'在revalidate()之前。父母是我的JLayeredPane,我有6個,每行一個。它確實刷新了佈局,但元素卻以一種我看不到圖案的奇怪方式移動。對於這裏感興趣的是代碼:https://drive.google.com/file/d/0Bwh-sPx-NX2oZEVZWms5b3VpdE0/edit?usp=sharing – Florent

+0

'父母是我的JLayeredPane,我有6個,每個line.' - 對我沒有意義。分層窗格用於顯示組件的頂部(即Z軸)。你的組件是垂直顯示的,所以你應該使用佈局管理器。 'parent.setSize(size);' - 每當我看到這樣的代碼,就意味着你正在使用空佈局。 Swing旨在與佈局管理器一起使用,以便在框架大小更改時組件會自動調整大小/重新定位。 – camickr

+0

ui已經使用NetBeans構建,意味着每個地方都有'GroupLayout'。當我使用'layeredpane.remove(scrollpane)'元素成功調整大小時,如果我調整窗口的大小,它是一樣的。當我添加元素時,'JLayeredPane'保持它的小尺寸,隱藏它所包含的'JScrollPane'。我更新了我的代碼:https://drive.google.com/file/d/0Bwh-sPx-NX2oZEVZWms5b3VpdE0/edit?usp=sharing – Florent

0

那麼,你可以添加一個監聽器到框架中,以便在框架被調整大小時對事件進行操作。然後打包()框架。

public final class TestFrame extends JFrame { 

(...) 

    this.getRootPane().addComponentListener(new ComponentAdapter() { 
     public void componentResized(ComponentEvent e) { 

      this.pack(); 
      this.revalidate(); 

     } 
    }); 

} 

它你使用的是繪圖圖形方法,你應該重繪()你的框架。

在該方法中,您還可以通過基於e來計算窗口來手動設置窗口的首選大小。的getWidth()

+0

似乎有點極端和低效,因爲這種方法通常會被調用。我喜歡camickr解決方案更好地刪除和添加。 – Florent

相關問題