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

如何修改Java Swing代码实现从JTable返回选中的Articoli对象

解决Java Swing中获取JTable选中Articoli对象的方案

步骤1:修改PanelArticoliPerOrdine类,支持选中项获取与模态显示

添加确认/取消按钮让用户提交选择,将对话框设为模态(阻塞主线程直到窗口关闭),并新增获取选中对象的方法:

public class PanelArticoliPerOrdine extends abstractClass {
    private JDialog frame; // 移除static修饰,改为实例变量
    public JTable table;
    public MyTableModelArticoliPerOrdine tableModel;
    private List<Articoli> selectedArticoli; // 存储用户选中的对象
    public Font fontTable;

    public PanelArticoliPerOrdine(List<Articoli> articoliMancanti) {
        this.selectedArticoli = new ArrayList<>();
        fontTable = new Font("Century Gothic", Font.PLAIN, 16);

        tableModel = new MyTableModelArticoliPerOrdine();
        tableModel.stampaTabella(articoliMancanti);

        table = new JTable(tableModel);
        daiProprietaJTable();

        JScrollPane jScrollPane1 = new JScrollPane();
        jScrollPane1.setViewportView(table);
        jScrollPane1.setPreferredSize(new Dimension(700, 300));

        // 添加按钮面板
        JPanel buttonPanel = new JPanel();
        JButton confirmBtn = new JButton("确认");
        JButton cancelBtn = new JButton("取消");

        confirmBtn.addActionListener(e -> {
            // 获取选中行对应的Articoli对象
            int[] selectedRows = table.getSelectedRows();
            for (int row : selectedRows) {
                // 转换为模型行索引(避免排序后索引错位)
                int modelRow = table.convertRowIndexToModel(row);
                selectedArticoli.add(tableModel.getArticoloAt(modelRow));
            }
            chiudi();
        });

        cancelBtn.addActionListener(e -> chiudi());

        buttonPanel.add(confirmBtn);
        buttonPanel.add(cancelBtn);

        // 调整布局:滚动面板+按钮面板
        JPanel radioPanel = new JPanel(new BorderLayout());
        radioPanel.setBorder(BorderFactory.createTitledBorder("选择商品"));
        radioPanel.add(jScrollPane1, BorderLayout.CENTER);
        radioPanel.add(buttonPanel, BorderLayout.SOUTH);

        add(radioPanel, BorderLayout.LINE_START);
        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    }

    // 新增:获取用户选中的Articoli列表
    public List<Articoli> getSelectedArticoli() {
        return selectedArticoli;
    }

    public void daiProprietaJTable() {
        table.setRowHeight(25);
        table.setFont(fontTable);
        table.getColumnModel().getColumn(0).setPreferredWidth(560);
        table.getColumnModel().getColumn(1).setPreferredWidth(70);
        table.getColumnModel().getColumn(2).setPreferredWidth(70);
        DefaultTableCellRenderer renderer_archivi = new DefaultTableCellRenderer();
        renderer_archivi.setHorizontalAlignment(SwingConstants.RIGHT);
        table.getColumnModel().getColumn(1).setCellRenderer(renderer_archivi);
        table.getColumnModel().getColumn(2).setCellRenderer(renderer_archivi);
    }

    // 修改为非静态方法,创建模态对话框
    public void createAndShowGUI() {
        frame = new JDialog();
        frame.setTitle("选择商品");
        Dimensione d2 = new Dimensione();
        d2.setSize(800, 500);
        frame.setPreferredSize(d2);
        frame.setResizable(false);
        frame.setModal(true); // 模态窗口会阻塞调用线程,直到窗口关闭

        // 居中窗口
        CentraComponents centra = new CentraComponents();
        Point coordinate = centra.centra(frame);
        frame.setLocation(coordinate);

        frame.setContentPane(this);
        frame.pack();
        frame.setVisible(true);
    }

    public void chiudi() {
        frame.dispose();
    }
}

补充:MyTableModelArticoliPerOrdine需新增获取对象的方法

确保表格模型能根据索引返回对应的Articoli对象:

public class MyTableModelArticoliPerOrdine extends AbstractTableModel {
    private List<Articoli> data;
    // 原有代码...

    public void stampaTabella(List<Articoli> articoli) {
        this.data = articoli;
        fireTableDataChanged();
    }

    // 新增:根据索引获取Articoli对象
    public Articoli getArticoloAt(int index) {
        return data.get(index);
    }

    // 原有getColumnCount、getRowCount、getValueAt等方法...
}

步骤2:修改controllaQuantita方法,返回选中的Articoli列表

将方法返回类型从void改为List<Articoli>,返回用户选中的对象:

public List<Articoli> controllaQuantita(boolean isTagliaColore, List<Articoli> artInMagazzino){
    PanelArticoliPerOrdine panelArtM = new PanelArticoliPerOrdine(artInMagazzino);
    panelArtM.createAndShowGUI(); // 模态窗口阻塞到关闭
    return panelArtM.getSelectedArticoli();
}

步骤3:修改主方法leggiOrdineDaFile_Moderna,处理选中对象

调用controllaQuantita后,接收返回的选中列表并完成业务逻辑:

public Carico leggiOrdineDaFile_Moderna(Fornitore f,String file,List<Articoli> listaArticoliDett){
    try{
        BufferedReader br = new BufferedReader(new FileReader(file));
        String strLine;
        Carico ordine = new Carico();
        List<DettOrdini> listaArticoli = new ArrayList<DettOrdini>();
        int cont=0;

        while ((strLine = br.readLine()) != null)   {
            String codiceABarre = strLine.substring(93,113);
            Articoli articolo = modelManager.getArticoliManager().estraiArticolo(codiceABarre,true,null,false);
            
            if(articolo !=null){
                // 原有业务逻辑...
            }else{
                int risposta = VisualMessageOrdini.getInserimentoNuovoArticolo(nomeArticolo,codiceABarre);
                if(risposta == 0){
                    // 原有业务逻辑...
                } else {
                    // 获取用户选中的Articoli列表
                    List<Articoli> selectedArticoli = controllaQuantita(false, listaArticoliDett);
                    // 将选中对象转换为订单详情并添加
                    for(Articoli art : selectedArticoli){
                        DettOrdini dett = new DettOrdini();
                        dett.setArticolo(art);
                        // 设置其他订单详情属性...
                        listaArticoli.add(dett);
                    }
                }
            }
            cont++;
        }

        br.close();
        ordine.setDettOrdini(listaArticoli);
        ordine.setFornitore(f);
        return ordine;
    }catch (Exception e){
        log.logStackTrace(e);
        return null;
    }
}

内容的提问来源于stack exchange,提问作者bircastri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:01:44