从另一个jinternalframe动态更新jinternalframe表

时间:2016-11-18 01:50:36

标签: java mysql database swing jtable

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

所以也许你说你想要&#34;数据&#34;在两个表中都是一样的。

如果是这种情况,那么您可以在两个表之间共享DefaultTableModel model = new DefaultTableModel(...); JTable table1 = new JTable( model ); JTable table2 = new JTable( model ); 。然后,当数据在一个中更改时,它会在另一个中自动更新:

TableColumn

如果您愿意,可以在其中一个表格中显示不同的列,因为您可以从TableColumnModel中删除TableColumnModel tcm = table1.getColumnModel(); tcm.removeColumn( tcm.getColumn(...) ); // specify column number 。类似的东西:

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

this.productss = []

this.products = af.database.list('/products')
this.products.subscribe((data: any) => {
    data.forEach(item => {
      firebase.storage().ref().child('products/' + item.img)
        .getDownloadURL()
        .then(url => {
          item.image = url;
          this.productss.push(item)
        });
    })
  }
)

答案 1 :(得分:0)

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

在第一帧内我添加:

public static JTable getTable(){
    return table1;
}

在第二帧中我实现了它:

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