【问题标题】:Update jinternalframe table dynamically from another jinternalframe从另一个 jinternalframe 动态更新 jinternalframe 表
【发布时间】:2023-12-29 11:20:01
【问题描述】:

我有两个 jinternalframes,第一个用于查看,另一个用于数据处理。第一个jinternalframe的数据表与第二个jinternalframe相同。我想要的是在我从第二个 jinternalframe 添加数据后,让第一个 jinternalframe 更新它的 jtable。请参阅附件的第一个 jinternal 框架和第二个 jinternalframe 的照片。

这是第一帧的代码sn-p:

    table1 = new JTable();
    table1.setModel(loadTable1());
    scrollPane.setViewportView(table1);
    }
    public static DefaultTableModel loadTable1(){
    data = new ModelDB();
    tableModel1 = new DefaultTableModel();
    tableModel1.addColumn("ID");
    tableModel1.addColumn("Allocation");
    tableModel1.addColumn("Shipment Date");
    tableModel1.addColumn("Buyers");
    tableModel1.addColumn("Design");

    try{
        List<String> id = data.getAllocation().get(0);
        List<String> allocation = data.getAllocation().get(1);
        List<String> shipdate = data.getAllocation().get(2);
        List<String> buyers = data.getAllocation().get(3);
        List<String> design = data.getAllocation().get(4);

        for(int i=0;i<id.size();i++){
            tableModel1.addRow(new Object[]{
                    id.get(i),allocation.get(i),shipdate.get(i),buyers.get(i),design.get(i)
            });
        }
    }catch(Exception ex){}

    return tableModel1;
}

这是第二帧的代码sn-p:

@Override
public void actionPerformed(ActionEvent evt){
    data = new ModelDB();
    String action = evt.getActionCommand();
    String allocation = txtAllocation.getText().toUpperCase();
    Date shipdate = (Date) shipDate.getModel().getValue();
    String buyers = String.valueOf(model4.getCheckeds()).replaceAll("[\\[\\](){}]", "");
    String design = String.valueOf(model.getCheckeds()).replaceAll("[\\[\\](){}]","");
    String stylecode = String.valueOf(model2.getCheckeds()).replaceAll("[\\[\\](){}]", "");
    String sizes = String.valueOf(model3.getCheckeds()).replaceAll("[\\[\\](){}]", "");
    String pcspack = txtPcsPack.getText();
    String season = txtSeason.getText().toUpperCase();
    String orderqty = txtQtyOrder.getText();

    if(action.equals("Add")){
        btnSave.setText("Save");
        btnSave.setActionCommand("Save");
        btnCancel.setEnabled(true);
        txtAllocation.setEnabled(true);
        txtAllocation.grabFocus();
        shipDate.setEnabled(true);
        cmbBuyers.setEnabled(true);
        cmbDesign.setEnabled(true);
        cmbStyleCode.setEnabled(true);
        cmbSize.setEnabled(true);
        txtPcsPack.setEnabled(true);
        txtSeason.setEnabled(true);
        txtQtyOrder.setEnabled(true);
    }
    else if(action.equals("Save")){
        if(allocation.isEmpty() || shipdate.equals("") || pcspack.isEmpty() || season.isEmpty() || season.isEmpty() || orderqty.isEmpty() || buyers.isEmpty()||
                design.isEmpty() || stylecode.isEmpty() || sizes.isEmpty()){
            message.showMessageDialog(null, "Nothing to save");
        }
        else{
            try{
                if(data.addAllocation(allocation, shipdate, buyers, design, stylecode, sizes, pcspack, season, orderqty) == true){
                    message.showMessageDialog(null, "Data have been successfully saved");
                }
                else{
                    message.showMessageDialog(null, "Failed to save");
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }
            table1.setModel(loadTable());
        }
        btnSave.setText("Add");
        btnSave.setActionCommand("Add");
        btnCancel.setEnabled(false);
        txtAllocation.setEnabled(false);
        shipDate.setEnabled(false);
        cmbBuyers.setEnabled(false);
        cmbDesign.setEnabled(false);
        cmbStyleCode.setEnabled(false);
        cmbSize.setEnabled(false);
        txtPcsPack.setEnabled(false);
        txtSeason.setEnabled(false);
        txtQtyOrder.setEnabled(false);

        txtAllocation.setText("");
        model.removeChecks();
        model2.removeChecks();
        model3.removeChecks();
        model4.removeChecks();
        txtPcsPack.setText("");
        txtSeason.setText("");
        txtQtyOrder.setText("");
    }

    else if(action.equals("Cancel")){
        btnSave.setText("Add");
        btnSave.setActionCommand("Add");
        btnCancel.setEnabled(false);
        txtAllocation.setEnabled(false);
        shipDate.setEnabled(false);
        cmbBuyers.setEnabled(false);
        cmbDesign.setEnabled(false);
        cmbStyleCode.setEnabled(false);
        cmbSize.setEnabled(false);
        txtPcsPack.setEnabled(false);
        txtSeason.setEnabled(false);
        txtQtyOrder.setEnabled(false);

        txtAllocation.setText("");
        model.removeChecks();
        model2.removeChecks();
        model3.removeChecks();
        model4.removeChecks();
        txtPcsPack.setText("");
        txtSeason.setText("");
        txtQtyOrder.setText("");
    }
}

【问题讨论】:

  • 您发布了一些模糊的愿望、代码 sn-ps 和图像,我不确定我们中的任何人将如何理解您的问题,这将使我们能够创建一个连贯的答案。如果您没有很快得到其中之一,请考虑努力将更多注意力集中在您的代码、您的问题和您的问题上,包括创建和发布有效的minimal reproducible example 并提出一个非常具体且可回答的问题。祝你好运。
  • ......你好?
  • 另请注意,这两个 jinternalframes 属于两个不同的类...

标签: java mysql database swing jtable


【解决方案1】:

第一个 jinternalframe 的表和第二个 jinternalframe 相同。

它不能是同一个表,因为 Swing 组件只能有一个父级。所以你必须有两张桌子。

我想要的是在我从第二个 jinternalframe 添加数据后,让第一个 jinternalframe 更新它的 jtable。

所以也许您是说您希望两个表中的“数据”相同。

如果是这种情况,那么您可以在两个表之间共享TableModel。然后,当其中一个数据发生变化时,另一个数据会自动更新:

DefaultTableModel model = new DefaultTableModel(...);
JTable table1 = new JTable( model );
JTable table2 = new JTable( model );

如果您愿意,可以在其中一个表中显示不同的列,因为您可以从 TableColumnModel 中删除 TableColumn。比如:

TableColumnModel tcm = table1.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) ); // specify column number

table1.removeColumn( table1.getColumn(...) ); // specify column name

【讨论】:

  • 是的,我的意思是第一个jinternalframe表中的数据和第二个jinternalframe表中的数据是一样的。
  • 我试过你的代码,它仍然没有更新第一个 jinternalframe 的 jtable....
【解决方案2】:

感谢camickr 的想法,我通过让其他框架访问第一框架的表来解决我的问题。此外,我通过仅创建 DefaultTableModel 的实例修复了一些代码以使其整洁。这是解决我问题的代码:

在第一帧我添加了这个:

public static JTable getTable(){
    return table1;
}

在第二个框架内我实现了它:

firstFrame.getTable().setModel(table.loadAlloc());

【讨论】:

    最近更新 更多