首页 > 解决方案 > 如何将不同大小的元素立即放在另一个之上?

问题描述

下面的程序段生成如图红框内的输出:

st = c.con.createStatement();
rs = st.executeQuery("SELECT itemName, itemMaxQty, itemImage FROM item");

while(rs.next()){
    JPanel itemPanel = new JPanel();

    itemPanel.setLayout(new BoxLayout(itemPanel, BoxLayout.PAGE_AXIS));
    JPanel componentPanel = new JPanel();
    componentPanel.setLayout(new FlowLayout(FlowLayout.LEFT));

    JLabel itemName = new JLabel(rs.getString(1));
    ImageIcon itemImage = new ImageIcon(rs.getString(3));
    Image scaleImage = itemImage.getImage().getScaledInstance(120, 120, Image.SCALE_SMOOTH);
    JLabel imageHolder = new JLabel(new ImageIcon(scaleImage));
    JSpinner quantityField = new JSpinner();
    Dimension d = quantityField.getPreferredSize();
    d.width = 60;
    d.height = 30;
    quantityField.setPreferredSize(d);

    componentPanel.add(imageHolder);
    componentPanel.add(quantityField);
    itemPanel.add(componentPanel);
    itemPanel.add(itemName);

    add(itemPanel);
}

程序输出

我知道代码的某些部分可能不是最好的方法,但根据我所拥有的知识,这就是我现在可以做的。

我实际上有两个问题。

首先,我不明白为什么itemName's 的价值(纸杯蛋糕架、金龟子等)是居中的。

1.如何使其左居中,使其与顶部的相应图片对齐?

其次,如您所见,componentPanel(图片和JSpinner)和itemName之间有很大的空间。我认为这是因为为 itemName 分配的高度与为 componentPanel 分配的高度相同。所以

2.我如何使itemName下面的componentPanel

标签: javaswingjlabellayout-managerboxlayout

解决方案


您可以通过将LayoutManagerof更改itemPanelBorderLayout(使用该行itemPanel.setLayout(new BorderLayout());)来做到这一点,并以这种方式添加组件itemPanel

itemPanel.add(componentPanel, BorderLayout.CENTER);
itemPanel.add(itemName, BorderLayout.SOUTH);

推荐阅读