如何修改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
相关产品推荐
相关产品推荐

