下面的代碼在一個 JFrame 中放置了 3 個 JPanel。我希望藍色面板的寬度為 300(假設封閉框架的寬度大于 300)。其他兩個面板的寬度應該是余數。我怎么做?
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PanelTest extends JFrame {
private JPanel leftpanel;
public PanelTest() {
getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.X_AXIS));
this.leftpanel = new JPanel() {
@Override
public Dimension getMaximumSize() {
return new Dimension(300, 9999);
}
@Override
public Dimension getMinimumSize() {
return new Dimension(300, 0);
}
};
this.leftpanel.setBackground(Color.blue);
getContentPane().add(leftpanel);
JPanel rightpanel = new JPanel();
getContentPane().add(rightpanel);
rightpanel.setLayout(new BoxLayout(rightpanel, BoxLayout.Y_AXIS));
JPanel upperpanel = new JPanel();
upperpanel.setBackground(Color.red);
rightpanel.add(upperpanel);
JPanel lowerpanel = new JPanel();
lowerpanel.setBackground(Color.yellow);
rightpanel.add(lowerpanel);
pack();
setVisible(true);
setExtendedState(Frame.MAXIMIZED_BOTH);
}
public static void main(String[] args) {
new PanelTest();
}
}

我使用@camickr 的使用 BorderLayout 的建議稍微更新了上面的代碼。寬度現在是所需的。謝謝@camickr。
我仍然認為 BoxLayout 應該尊重最小和最大尺寸。考慮到這些,它應該將寬度設定為 500。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PanelTest extends JFrame {
public PanelTest() {
getContentPane().setLayout(new BorderLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel leftpanel = new JPanel();
int width = 500;
leftpanel.setPreferredSize(new Dimension(width, 1));
leftpanel.setBackground(Color.blue);
getContentPane().add(leftpanel, BorderLayout.LINE_START);
JPanel rightpanel = new JPanel();
getContentPane().add(rightpanel, BorderLayout.CENTER);
rightpanel.setLayout(new BoxLayout(rightpanel, BoxLayout.Y_AXIS));
JPanel upperpanel = new JPanel();
upperpanel.setBackground(Color.red);
rightpanel.add(upperpanel);
JPanel lowerpanel = new JPanel();
lowerpanel.setBackground(Color.yellow);
rightpanel.add(lowerpanel);
pack();
setVisible(true);
setExtendedState(Frame.MAXIMIZED_BOTH);
}
public static void main(String[] args) {
new PanelTest();
}
}
uj5u.com熱心網友回復:
組件最重要的尺寸是首選尺寸。大多數布局管理器會首先使用這個尺寸,然后根據可用空間使用最小/最大尺寸。
如果您不指定面板的首選大小,它將是 (10, 10),因為這是在未添加組件時使用 FlowLayout 的面板的默認大小。
此大小超出了最小/最大值的范圍,因此 BoxLayout 會根據每個面板的最大大小按比例為每個組件分配空間。藍色面板的大小為 300,另一個面板的大小為 Integer.MAX_VALUE,因此為另一個面板分配了更多空間。
一種解決方案是添加:
leftpanel.setPreferredSize(new Dimension(300, 1));
我希望藍色面板的寬度為 300
我不會將內容窗格更改為使用 BoxLayout,而是只使用框架的默認 BorderLayout。然后你:
- 將藍色面板添加到
BorderLayout.LINE_START. - 將包含紅色/黃色組件的面板添加到
BorderLayout.CENTER.
BorderLayout 將尊重藍色面板的寬度,并將剩余空間留給中心的組件。
使用這種方法,無需覆寫藍色面板的最小值/最大值。
當然,您仍然需要設定藍色面板的首選尺寸。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430682.html
上一篇:顫動中的滾動導航
