从另一个内部框架动态更新内部框架 table

Update jinternalframe table dynamically from another jinternalframe

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

这是第一帧的代码片段:

    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;
}

这是第二帧的代码片段:

@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("");
    }
}

The table of the first jinternalframe is the same as the second jinternalframe.

不能相同table因为一个 Swing 组件只能有一个父组件。所以你必须有两个 tables.

What I want is to make the first jinternalframe updates its jtable after I added data from second jinternalframe.

所以也许您是说您希望 "data" 在两个 table 中相同。

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

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

如果需要,您可以在 table 之一中显示不同的列,因为您可以从 TableColumnModel 中删除 TableColumn。类似于:

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

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

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

在第一帧中我添加了这个:

public static JTable getTable(){
    return table1;
}

在第二帧中我实现了它:

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