2017-10-17 97 views
1

我一直在努力解決這個問題一段時間,我有兩個類,即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?

+0

可能會重構您的代碼,以便SQL可以調用另一個類, –

+0

@ScaryWombat感謝您的回覆。但是,jTable呢? 我的意思是如果我創建一個類刷新擴展OrderSearch {}'它會再次給我stackoverflow錯誤。對不起,我是java中的一個newby – Ajay

+0

爲什麼要擴展'OrderSearch'在我看來,這個重構後的代碼應該能夠獨立運行,而不管你將它連接到什麼地方。鬆散耦合的代碼是目標 –

回答

0

不,沒有辦法做到這一點假設你目前的設置。這導致我們得出結論,您需要重構代碼。主要的問題是你的代碼沒有辦法在不創建框架的情況下執行所需的db命令。您將需要separate the engine from the ui。您將需要能夠執行業務邏輯,而不會受限於UI事件。 UI應該是業務邏輯的用戶,而不是其包裝。您需要將所有業務邏輯轉移到單獨的類中,並在相應的地點和事件中從ui調用相關方法。

+0

感謝您的回答和鏈接。這似乎很多工作,但我希望你提供的鏈接有幫助。 – Ajay

+1

@Ajay歡迎您!基本的想法是,你需要組織你的代碼,以便消除所有不必要的依賴。您將擁有必要的依賴關係,但不必要的依賴性會使您的工作非常困難。如果你掌握了這個概念,突然間一切都會變得容易多了。 –

+0

明白了!謝謝! – Ajay

相關問題