[英]Jsplitpane automatically resizes
我有一個JSPlitPane,它們之間有50%的分隔線。 可以正常工作。
但是,當我在右側添加一些JLabel時,jsplitpane會忽略我的50%分隔符,而左側窗格會增大其大小,而只是壓扁右側。
為什么會發生這種情況以及如何解決?
我的代碼是:
import javax.swing.*;
import java.awt.*;
public class Example {
private static void setup() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500, 500));
frame.setFocusable(true);
JSplitPane pane= new JSplitPane();
pane.setResizeWeight(0.5);
pane.setRightComponent(new JPanel());
JPanel myPanel = new JPanel();
myPanel.setLayout(new FlowLayout());
for(int i=0; i<20; i++) myPanel.add(new JLabel("hello"));
pane.setLeftComponent(myPanel);
frame.add(pane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
setup();
}
});
}
}
但是,當我在右側添加一些JLabel時,jsplitpane會忽略我的50%分隔符,而左側窗格會增大其大小,而只是壓扁右側。
拆分窗格將首先計算每個組件的首選大小。
調整大小權重用於在調整拆分窗格的大小時分配空間。 在這種情況下,當框架可見時,就會發生這種情況。 因此,如果添加到拆分窗格中的組件的首選大小小於顯示該框架時拆分窗格的大小,則每個組件將獲得50%的額外空間。
在第一種情況下,沒有組件,因此每個面板的首選大小是相同的,因此,在調整拆分窗格的大小時,它們各自具有相同的空間。
在第二種情況下,第一個面板的首選大小將是添加到該面板的所有標簽的寬度,第二個面板的大小應為0。由於第一個面板的首選寬度大於框架的大小,因此沒有多余的空間分配給第二個面板的空間。
嘗試添加1或2個標簽(而不是20個),看看會發生什么。
編輯:
一些問題:
1)調整大小的重量不符合您的預期。 當分隔線以慢速移動時,將為每個像素生成一個事件。 那么像素不能同時被兩個組件共享,因此將像素分配給正確的組件。
我建議您使用的解決方案是使用調整大小權重“ 1.0”,以便標簽組件獲得所有空間。
2)JSplitPane遵循組件的最小尺寸,這意味着您不能將欄拖動到組件的最小尺寸之外。 對於您的面板,最小尺寸與首選尺寸相同,因此您將無法將分隔線拖動得更小。
解決方案是重寫面板的getMinimumSize()
方法以返回一些較小的尺寸
這可以通過將setDividerLocation(...)
方法包裝在SwingUtilities.invokeLater()中來完成。
以上3條建議已添加到您的MCVE中:
import javax.swing.*;
import java.awt.*;
public class Example {
private static void setup() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500, 500));
frame.setFocusable(true);
JSplitPane pane= new JSplitPane();
pane.setResizeWeight(1.0);
pane.setRightComponent(new JPanel());
JPanel myPanel = new JPanel()
{
@Override
public Dimension getMinimumSize()
{
return new Dimension(50, 50);
}
};
myPanel.setLayout(new FlowLayout());
for(int i=0; i<20; i++) myPanel.add(new JLabel("hello"));
pane.setLeftComponent(myPanel);
frame.add(pane);
frame.pack();
frame.setVisible(true);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
pane.setDividerLocation(0.5f);
}
});
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
setup();
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.