我有两个jinternalframes,第一个用于查看,另一个用于数据处理。第一个jinternalframe的数据表与第二个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("");
}
}
答案 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());