两个 JPanel 之间的水平粘合未按预期运行
Horizontal glue between two JPanels not functioning as intended
我遇到了 BoxLayout JPanel 无法正确显示水平胶水的问题。我相信我已经将问题缩小到没有额外的水平 space 来拉动胶水,因为刚性区域在每个面板之间创建 space 没有问题。话虽如此,我似乎无法找到导致此问题的组件或设置。
这是包含相关代码的方法(我用多行注释包围了添加水平胶水的代码部分):
public void initialize() {
scrollPanel.removeAll();
for (Item item : getController().getCart().getItemList()) {
//Container
itemContainerPanel = new JPanel();
itemContainerPanel.setBorder(new EmptyBorder(0, 10, 10, 0));
itemContainerPanel.setLayout(new BoxLayout(itemContainerPanel, BoxLayout.Y_AXIS));
//Content panel
itemPanel = new JPanel();
itemPanel.setLayout(new BoxLayout(itemPanel, BoxLayout.X_AXIS));
itemPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
//itemPanel.setBorder(new LineBorder(Color.BLACK));
itemContainerPanel.add(itemPanel);
//Details left
detailsLeftPanel = new JPanel();
detailsLeftPanel.setLayout(new BoxLayout(detailsLeftPanel, BoxLayout.Y_AXIS));
detailsLeftPanel.setAlignmentY(Component.TOP_ALIGNMENT);
titlePanel = new JPanel();
FlowLayout titlePanelLayout = new FlowLayout(FlowLayout.LEFT);
titlePanelLayout.setHgap(0);
titlePanelLayout.setVgap(0);
titlePanel.setLayout(titlePanelLayout);
productNameLabel = new JLabel();
productNameLabel.setAlignmentX(LEFT_ALIGNMENT);
productNameLabel.setAlignmentY(TOP_ALIGNMENT);
titlePanel.add(productNameLabel);
detailsLeftPanel.add(titlePanel);
datesBookedPanel = new JPanel();
FlowLayout datesBookedPanelLayout = new FlowLayout(FlowLayout.LEFT);
datesBookedPanelLayout.setHgap(0);
datesBookedPanelLayout.setVgap(0);
datesBookedPanel.setLayout(datesBookedPanelLayout);
datesBookedLabel = new JLabel();
datesBookedLabel.setAlignmentX(LEFT_ALIGNMENT);
datesBookedPanel.setAlignmentY(TOP_ALIGNMENT);
datesBookedPanel.add(datesBookedLabel);
detailsLeftPanel.add(datesBookedPanel);
//Details right
detailsRightPanel = new JPanel();
detailsRightPanel.setLayout(new BoxLayout(detailsRightPanel, BoxLayout.Y_AXIS));
detailsRightPanel.setAlignmentY(Component.TOP_ALIGNMENT);
removePanel = new JPanel();
removePanel.setLayout(new BoxLayout(removePanel, BoxLayout.X_AXIS));
detailsRightPanel.add(removePanel);
cartItemPriceLabel = new JLabel();
cartItemPriceLabel.setAlignmentY(Component.CENTER_ALIGNMENT);
removePanel.add(cartItemPriceLabel);
removeBtn = new JButton("Remove");
removeBtn.setAlignmentY(Component.CENTER_ALIGNMENT);
removePanel.add(removeBtn);
/* ITEM PANEL BUILD WITH HORIZONTAL GLUE */
itemPanel.add(detailsLeftPanel);
itemPanel.add(Box.createHorizontalGlue());
itemPanel.add(detailsRightPanel);
}
如有任何帮助,我们将不胜感激。谢谢,祝你有愉快的一天。
编辑:
我添加了一张图片
显示上面代码部分的输出。我在图像上画的红线显示了放置水平胶水的位置。胶水应该将带有价格标签的面板和移除按钮向右推以填充 window 的宽度,但它没有。
问题是 "itemPanel" 以其首选大小显示,因此您永远不会看到 "horizontal glue"
你加你"itemPanel"到"itemContainerPanel"。你不应该需要这第二个面板。在任何情况下,我都看不到将 "itemContainerPanel" 添加到其父容器的位置。
我猜你应该将 "itemPanel" 直接添加到你的 "scrollPanel"。因此 "scrollPanel" 需要使用一种布局,允许其子组件水平扩展以填充整个 space。所以我猜 "scrollPanel" 应该使用垂直 BoxLayout。
我遇到了 BoxLayout JPanel 无法正确显示水平胶水的问题。我相信我已经将问题缩小到没有额外的水平 space 来拉动胶水,因为刚性区域在每个面板之间创建 space 没有问题。话虽如此,我似乎无法找到导致此问题的组件或设置。
这是包含相关代码的方法(我用多行注释包围了添加水平胶水的代码部分):
public void initialize() {
scrollPanel.removeAll();
for (Item item : getController().getCart().getItemList()) {
//Container
itemContainerPanel = new JPanel();
itemContainerPanel.setBorder(new EmptyBorder(0, 10, 10, 0));
itemContainerPanel.setLayout(new BoxLayout(itemContainerPanel, BoxLayout.Y_AXIS));
//Content panel
itemPanel = new JPanel();
itemPanel.setLayout(new BoxLayout(itemPanel, BoxLayout.X_AXIS));
itemPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
//itemPanel.setBorder(new LineBorder(Color.BLACK));
itemContainerPanel.add(itemPanel);
//Details left
detailsLeftPanel = new JPanel();
detailsLeftPanel.setLayout(new BoxLayout(detailsLeftPanel, BoxLayout.Y_AXIS));
detailsLeftPanel.setAlignmentY(Component.TOP_ALIGNMENT);
titlePanel = new JPanel();
FlowLayout titlePanelLayout = new FlowLayout(FlowLayout.LEFT);
titlePanelLayout.setHgap(0);
titlePanelLayout.setVgap(0);
titlePanel.setLayout(titlePanelLayout);
productNameLabel = new JLabel();
productNameLabel.setAlignmentX(LEFT_ALIGNMENT);
productNameLabel.setAlignmentY(TOP_ALIGNMENT);
titlePanel.add(productNameLabel);
detailsLeftPanel.add(titlePanel);
datesBookedPanel = new JPanel();
FlowLayout datesBookedPanelLayout = new FlowLayout(FlowLayout.LEFT);
datesBookedPanelLayout.setHgap(0);
datesBookedPanelLayout.setVgap(0);
datesBookedPanel.setLayout(datesBookedPanelLayout);
datesBookedLabel = new JLabel();
datesBookedLabel.setAlignmentX(LEFT_ALIGNMENT);
datesBookedPanel.setAlignmentY(TOP_ALIGNMENT);
datesBookedPanel.add(datesBookedLabel);
detailsLeftPanel.add(datesBookedPanel);
//Details right
detailsRightPanel = new JPanel();
detailsRightPanel.setLayout(new BoxLayout(detailsRightPanel, BoxLayout.Y_AXIS));
detailsRightPanel.setAlignmentY(Component.TOP_ALIGNMENT);
removePanel = new JPanel();
removePanel.setLayout(new BoxLayout(removePanel, BoxLayout.X_AXIS));
detailsRightPanel.add(removePanel);
cartItemPriceLabel = new JLabel();
cartItemPriceLabel.setAlignmentY(Component.CENTER_ALIGNMENT);
removePanel.add(cartItemPriceLabel);
removeBtn = new JButton("Remove");
removeBtn.setAlignmentY(Component.CENTER_ALIGNMENT);
removePanel.add(removeBtn);
/* ITEM PANEL BUILD WITH HORIZONTAL GLUE */
itemPanel.add(detailsLeftPanel);
itemPanel.add(Box.createHorizontalGlue());
itemPanel.add(detailsRightPanel);
}
如有任何帮助,我们将不胜感激。谢谢,祝你有愉快的一天。
编辑:
我添加了一张图片
显示上面代码部分的输出。我在图像上画的红线显示了放置水平胶水的位置。胶水应该将带有价格标签的面板和移除按钮向右推以填充 window 的宽度,但它没有。
问题是 "itemPanel" 以其首选大小显示,因此您永远不会看到 "horizontal glue"
你加你"itemPanel"到"itemContainerPanel"。你不应该需要这第二个面板。在任何情况下,我都看不到将 "itemContainerPanel" 添加到其父容器的位置。
我猜你应该将 "itemPanel" 直接添加到你的 "scrollPanel"。因此 "scrollPanel" 需要使用一种布局,允许其子组件水平扩展以填充整个 space。所以我猜 "scrollPanel" 应该使用垂直 BoxLayout。