java - 如何将不同大小的元素立即放在另一个之上?
问题描述
下面的程序段生成如图红框内的输出:
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
?
解决方案
您可以通过将LayoutManager
of更改itemPanel
为BorderLayout
(使用该行itemPanel.setLayout(new BorderLayout());
)来做到这一点,并以这种方式添加组件itemPanel
:
itemPanel.add(componentPanel, BorderLayout.CENTER);
itemPanel.add(itemName, BorderLayout.SOUTH);
推荐阅读
- javascript - 当用户在我的 python 网站上注册时,他们的第一票不算数
- reactjs - 用钩子状态的数组反应无限滚动
- nunit - 是否可以为 xunit 中的某些测试添加等效的 nunit 设置属性?
- c# - empty for(;;) 代表什么?
- ios - 无法在iTunes连接中的Testflight下删除测试信息中的联系信息
- java - “咖喱”可运行文件的最干净方法
- python - 类型错误:from_formula() 缺少 1 个必需的位置参数:“数据”
- python - python:我怎样才能打印出我的文件行?
- gatsby - Gasby CMS 页面构建器
- java - java.lang.NullPointerException: null - 调用 getAttributes().contains(key) 时