[英]Java UI: set swing components behavior on resize
我很難正確設置我的揮桿組件在調整大小時的行為方式。
該接口存在兩個問題:
答:每行開頭的切換按鈕用於折疊/展開文本。 所有元素都包含在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
的值,這意味着我的右滾動條不粘在框架的右側。
參見下面兩個問題的演示:
您的展開/折疊代碼如何工作? 您只是使組件可見/不可見,還是從面板中添加刪除組件?
另一方面,折疊確實會隱藏文本,但會將所有元素保留在適當的位置。
如果添加/刪除組件,則基本代碼為:
panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();
表示我的右側滾動條不粘在框架的右側。
這取決於您使用的布局管理器。 我想最簡單的方法是使用GrigBagLayout。 它允許您“填充”可用空間。 閱讀Swing教程中有關如何使用GridBagLayout的部分, 以獲取更多信息和示例。
所有元素都包含在JLayeredPane中。
不知道為什么要使用分層窗格。 默認情況下,分層窗格不使用布局管理器。
好吧,您可以在框架中添加一個偵聽器,以便在調整框架大小時對事件進行操作。 然后打包()框架。
public final class TestFrame extends JFrame {
(...)
this.getRootPane().addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
this.pack();
this.revalidate();
}
});
}
如果您使用的是繪制圖形方法,則還應該重新繪制框架。
在該方法中,您還可以通過基於e.getWidth()進行計算來設置窗口的首選大小
根據camickr的回答和評論,看看我是如何解決的:
點A是由於我在NetBeans中使用了自由布局。 我沒有成功修復代碼,因此更改了元素的結構。 它可能不是最佳的,並且沒有正確使用所有的揮桿概念,但是可以按照我想要的方式工作。
我在后台使用GridBagLayout
的JLayeredPane
。 此背景窗格包含一列高度為30和260的JPanel
,一列為摘要行 ,另一列為詳細信息 。
由JToggleButton
控制的展開/折疊功能通過隱藏以下面板下面的面板belowPanel.setVisibility(false)
。 不需要重新包裝或其他任何東西。 這是不更改按鈕圖標的代碼的樣子:
private void inverseVisibility(JToggleButton expand, JPanel target) {
if (expand.isSelected()) {
target.setVisible(true);
} else {
target.setVisible(false);
}
}
因為我只希望元素水平調整大小,所以我所有面板的“ Horizontal
為“ Fill
值,“ Northwest
為“ Anchor
。 我將weightX = 1; weightY = 0
設置為weightX = 1; weightY = 0
weightX = 1; weightY = 0
。 最后,我在底部添加了一個帶有Southwest
錨的面板,並將兩個權重both
填充為1
(不確定它是否會改變任何東西,但是通過這種方式,我確定它將填充窗口調整大小時底部的所有空白。大於其內容的大小)。
通過將適合我Frame
背景面板放入JScrollPane
,解決了B點的問題。 我的錯誤是由於Netbeans編輯器沒有正確地將滾動窗格粘貼到框架的側面,這是由於框架和滾動窗格中定義的大小不一致。 如果您正在使用此工具,我的建議是設置盡可能少的值,因為gui設計器會大量互連很多值。
獲取完整的代碼 (95,864字節)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.