如何在JPanel中展示物品以实现库存系统?
如何在JPanel中展示物品以实现库存系统?
看起来你已经搭好了库存系统的基础框架——左边用JTree做分类选择,右边想在带JScrollPane的JPanel里批量展示你的DisplayItem自定义面板对吧?我完全理解你的需求,之前你能打开单个物品的JFrame,但不知道怎么把预制面板嵌入到已有滚动面板里,下面给你一步步讲实现方法:
第一步:给JTree添加分类选择监听
首先要监听用户在左侧JTree选中的分类节点,触发右侧面板的刷新逻辑。你需要给JTree绑定TreeSelectionListener,这样每次选中不同分类时,就能自动加载对应物品:
// 假设你的JTree实例叫categoryTree,右侧承载物品的面板叫itemContainerPanel categoryTree.addTreeSelectionListener(e -> { // 获取选中的分类节点 DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) categoryTree.getLastSelectedPathComponent(); if (selectedNode == null) return; // 空节点直接返回 String selectedCategory = selectedNode.toString(); // 触发面板刷新逻辑 refreshItemPanel(selectedCategory); });
第二步:实现面板刷新核心逻辑
写一个refreshItemPanel方法,负责清空旧内容、读取对应分类的Excel数据、创建并添加DisplayItem面板:
private void refreshItemPanel(String category) { // 1. 清空旧面板内容,避免重复叠加 itemContainerPanel.removeAll(); // 2. 设置合适的布局,让物品面板整齐排列 // 比如用GridLayout,每行3个物品,自动调整行数,间距10px itemContainerPanel.setLayout(new GridLayout(0, 3, 10, 10)); // 3. 用Apache POI读取对应分类的物品数据 // 这里假设你已经有了读取Excel的工具方法,返回物品列表 List<ShopItem> items = ExcelUtils.readItemsByCategory(category); // 4. 循环创建DisplayItem并填充数据 for (ShopItem item : items) { DisplayItem itemPanel = new DisplayItem(); // 给DisplayItem设置数据,你需要给这个预制面板添加对应的setter方法 itemPanel.setItemName(item.getName()); itemPanel.setItemId(item.getId()); itemPanel.setDescription(item.getDescription()); // 处理图片:如果图片路径来自Excel,先转成ImageIcon再设置,可按需缩放 Image scaledImage = new ImageIcon(item.getImagePath()).getImage().getScaledInstance(100, 100, Image.SCALE_SMOOTH); itemPanel.setItemImage(new ImageIcon(scaledImage)); // 将面板添加到容器中 itemContainerPanel.add(itemPanel); } // 5. 刷新面板,让新添加的组件显示出来 itemContainerPanel.revalidate(); itemContainerPanel.repaint(); }
关键补充:给DisplayItem添加数据设置方法
因为你的DisplayItem是用JPanel Form生成的,默认可能没有对外暴露设置控件数据的方法,所以需要手动给它加setter,比如:
public class DisplayItem extends JPanel { // 假设Form里的控件是jLabelName、jLabelId、jTextAreaDesc、jLabelPicture private JLabel jLabelName; private JLabel jLabelId; private JTextArea jTextAreaDesc; private JLabel jLabelPicture; // ... 自动生成的构造方法和初始化代码 ... public void setItemName(String name) { jLabelName.setText(name); } public void setItemId(String id) { jLabelId.setText(id); } public void setDescription(String desc) { jTextAreaDesc.setText(desc); } public void setItemImage(ImageIcon icon) { jLabelPicture.setIcon(icon); } }
优化小建议
- 避免UI卡顿:如果Excel里物品数量很多,建议用
SwingWorker异步读取数据,不然主线程会被阻塞,界面会假死。 - 灵活布局:如果GridLayout不符合你的需求,可以试试
FlowLayout(自动换行)或者BoxLayout(垂直/水平排列),甚至第三方的MigLayout来实现更复杂的排版。 - 交互增强:可以给每个
DisplayItem面板添加鼠标点击事件,比如点击弹出详情窗口,提升用户体验。
备注:内容来源于stack exchange,提问作者Victor Euan Jr
相关产品推荐
相关产品推荐

