You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:50:28