我一直在努力解決這個問題一段時間,我有兩個類,即OrderSearch.java
(主類)和CreateOrder.java
。我的主class
上有一個JTable
,當一行被雙擊時,它會打開一個新框架,即CreateOrder.java
,其值在jTable
之間的不同文本框中。我在CreateOrder.java中有一個SaveButton
,它保存在該類中所做的更改並再次顯示JTable
。兩個不同類的對象創建拋出Java中的StackOverflow
但是,問題是我不能執行刷新表操作,即單擊SaveButton時的一些SQL查詢。我希望框架中的表OrderSearch在點擊CreateOrder上的保存按鈕時被刷新
問題:爲CreateOrder.java中的類OrderSearch.java創建一個對象給了我一個stackoverflow錯誤。在保存按鈕中創建一個對象再次打開一個新的框架。
OrderSearch.java
public class OrderSearch extends CreateOrder{
//declarations for label,text, and buttons
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
OrderSearch window = new OrderSearch();
window.frmXraymanager.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public OrderSearch() { *Stack overflow error here*
initialize();
}
private void initialize() {
table = new JTable();
scrollPane.setViewportView(table);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e2) {
if (e2.getClickCount() == 2 && !e2.isConsumed()) {
e2.consume();
try{
int index = table.getSelectedRow();
String table_Click = table.getModel().getValueAt(table.convertRowIndexToModel(index), 0).toString();
String sql = "SELECT ID, Date, Place, UserName FROM TEST.dbo.Intern WHERE ID = '"+table_Click+"'";
PreparedStatement pst = connection.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
if(rs.next()){
String id = rs.getString("ID");
String date = rs.getString("Date").toString();
String place = rs.getString("Place");
String uname = rs.getString("UserName");
frameCreate.setVisible(true); //Frame from CreateOrder.java
Number.setText(id); // textfields from CreateOrder.java
String date1 = startDate;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
Date date2 = df.parse(date1);
dateChooser.setDate(date2);
jobSite.setText(place);
uName.setText(uname);
Component.setText(component);
Remarks.setText(remarks);
rs.close();
pst.close();
}
catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}
}
}
});
}
public void refresh()
{
query1 = "SELECT * FROM Test.dbo.Intern;
try(PreparedStatement pst = connection.prepareStatement(query1);
ResultSet rs = pst.executeQuery();){
table.setModel(DbUtils.resultSetToTableModel(rs));
table.setRowHeight(40);
}
catch(Exception e){
e.printStackTrace();
}
}
}
CreateOrder.java
public class CreateOrder {
public CreateOrder() {
initialize();
}
OrderSearch one = new OrderSearch(); *Stack overflow error here*
private void initialize() {
button_Save = new JButton("Save");
button_Save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
*would like to add refresh() here*
}
});
}
}
我應該如何創建CreateOrder OrderSearch的目的是存取權限的方法refresh()
沒有再次打開框架?
在此先感謝!
-Ajay
編輯:
其實,誤差值在
OrderSearch one = new OrderSearch();
和公共OrderSearch()
我完全理解這是有道理的,因爲它進入無限循環,當我撥打CreateOrder對象的.java。但有什麼辦法可以訪問CreateOrder.java中的OrderSearch.java的內容,而不會出現stackoverflow錯誤或再次打開整個新框架OrderSearch.java?
可能會重構您的代碼,以便SQL可以調用另一個類, –
@ScaryWombat感謝您的回覆。但是,jTable呢? 我的意思是如果我創建一個類刷新擴展OrderSearch {}'它會再次給我stackoverflow錯誤。對不起,我是java中的一個newby – Ajay
爲什麼要擴展'OrderSearch'在我看來,這個重構後的代碼應該能夠獨立運行,而不管你將它連接到什麼地方。鬆散耦合的代碼是目標 –