编辑 - 为了澄清我的问题,我决定编辑它。
我的问题涉及以下方法:
addTransactionButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
AllGUI allGUI = new AllGUI();
allGUI.createAllGUI();
TCRSpecificGUI tcrGUI = new TCRSpecificGUI();
tcrGUI.getNtryName();
dtm.addRow(new Object[]{TCRSpecificGUI.ntryName,AllGUI.bankTransCode,TCRSpecificGUI.endToEndId,
AllGUI.transAmount,AllGUI.initiatingPartyId,AllGUI.initiatingPartySchemeName,
AllGUI.debtorName,AllGUI.debtorAddress,TCRSpecificGUI.debtorAccountType,
TCRSpecificGUI.creditorAccountNumber,TCRSpecificGUI.proprietaryPartyType,AllGUI.debtorAgentName,
AllGUI.debtorAgentCity,AllGUI.debtorAgentCountrySubDvsn,AllGUI.creditorAgentClearingSystemId,
TCRSpecificGUI.purpose,TCRSpecificGUI.returnRejectReasonCode,TCRSpecificGUI.returnRejectReasonAdditionalInfo,
AllGUI.payInstrument,AllGUI.typeOfCheck,AllGUI.passThruData,AllGUI.clearingAccount,
AllGUI.jobId,TCRSpecificGUI.nachaTransactionCode,AllGUI.transactionType,
TCRSpecificGUI.auxillaryOnUsIndicator,TCRSpecificGUI.batchTypeFromSourceSystem,
TCRSpecificGUI.expressMailItem,TCRSpecificGUI.returnOccurance,TCRSpecificGUI.nameOfRMessageFile});
}
});
正在发生的事情是首先使用allGUI.createAllGUI()方法调用GUI。这是一个具有多个JTextAreas的JFrame,供用户填写。一旦用户单击第一个GUI上的确认按钮,第二个GUI就会显示更多字段。当用户确认每个GUI时,所有JTextArea信息都保存到字符串中,然后作为新行写入JTable。 (如上所示)。
问题在于上述逻辑意味着即使在用户完成GUI中文本字段的编辑之前,程序也会移动到dtm.addRow步骤。这意味着表的第一行将是完全空白的(因为GUI字段尚未保存为字符串)。
简而言之,问题是我需要一些方法来告诉程序“在用户单击allGUI.createALLGUI()方法第二个GUI中的确认按钮之前,不要调用addRow代码。
我终于找到了解决方案。由于一些用户决定将此问题标记为“空指针”副本,因此我只需将此答案发布在此处,然后希望如果问题重新打开,我可以将其作为答案发布。
我的解决方案是将addRow方法移动到它自己的类中,如下所示:
protected static void writeRow(){
dtm.addRow(new Object[]{TCRSpecificGUI.ntryName,AllGUI.bankTransCode,TCRSpecificGUI.endToEndId,
AllGUI.transAmount,AllGUI.initiatingPartyId,AllGUI.initiatingPartySchemeName,
AllGUI.debtorName,AllGUI.debtorAddress,TCRSpecificGUI.debtorAccountType,
TCRSpecificGUI.creditorAccountNumber,TCRSpecificGUI.proprietaryPartyType,AllGUI.debtorAgentName,
AllGUI.debtorAgentCity,AllGUI.debtorAgentCountrySubDvsn,AllGUI.creditorAgentClearingSystemId,
TCRSpecificGUI.purpose,TCRSpecificGUI.returnRejectReasonCode,TCRSpecificGUI.returnRejectReasonAdditionalInfo,
AllGUI.payInstrument,AllGUI.typeOfCheck,AllGUI.passThruData,AllGUI.clearingAccount,
AllGUI.jobId,TCRSpecificGUI.nachaTransactionCode,AllGUI.transactionType,
TCRSpecificGUI.auxillaryOnUsIndicator,TCRSpecificGUI.batchTypeFromSourceSystem,
TCRSpecificGUI.expressMailItem,TCRSpecificGUI.returnOccurance,TCRSpecificGUI.nameOfRMessageFile});
}
保留原始代码:
addTransactionButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
AllGUI allGUI = new AllGUI();
allGUI.createAllGUI();
TCRSpecificGUI tcrGUI = new TCRSpecificGUI();
tcrGUI.getNtryName();
}
});
最后,在我的GUI的最后一个阶段,用户填写了JTextFields,我添加了这个:
confirmButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
endToEndId=endToEndIdText.getText();
if(checkingButton.isSelected()){
debtorAccountType="Checking";
}else{
debtorAccountType="Savings";
}
creditorAccountNumber=creditorAccountNumberCombo.getSelectedItem().toString();
proprietaryPartyType=proprietaryPartyTypeText.getText();
purpose=purposeText.getText();
returnRejectReasonCode=returnRejectReasonCodeText.getText();
returnRejectReasonAdditionalInfo=returnRejectReasonAdditionalInfoText.getText();
nachaTransactionCode=nachaTransactionCodeText.getText();
if(yesAuxillaryButton.isSelected()){
auxillaryOnUsIndicator="YES";
}else{
auxillaryOnUsIndicator="NO";
}
batchTypeFromSourceSystem=batchTypeFromSourceSystemText.getText();
if(yesExpressButton.isSelected()){
expressMailItem="YES";
}else{
expressMailItem="NO";
}
returnOccurance=returnOccuranceText.getText();
nameOfRMessageFile=nameOfRMessageFileText.getText();
Component component = (Component)ae.getSource();
Window window = SwingUtilities.windowForComponent(component);
window.dispose();
TCRMainGUI.writeRow();
}
});
请注意这行代码的最底部:
TCRMainGUI.writeRow();
调用该方法来编写新行。
所以我现在有一个逻辑 1.当用户单击主JTable屏幕上的创建事务按钮时,将打开第一个GUI类。 2.用户填写字段并单击确认后,将值保存到字符串,然后打开下一个GUI。 3.用户填写第二个GUI上的字段并单击确认后保存值并调用添加行的方法 - 现在填充字符串,以便使用值写入行。