2017-10-17 54 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

相关问题