两个不同类的对象创建抛出Java中的StackOverflow

时间:2017-10-17 06:41:22

标签: java swing

我一直在努力解决这个问题,我有两个类,即OrderSearch.java(主要类)和CreateOrder.java。我的主JTable上有一个class,当一行被双击时,它会在不同的文本字段中打开一个新框架,即CreateOrder.java,其值为jTable。我在CreateOrder.java中有一个SaveButton,用于保存在课堂上所做的更改并再次显示JTable

然而问题是我无法执行刷新表操作,即单击SaveButton时的某些sql查询。我希望在单击CreateOrder上的保存按钮时刷新OrderSearch中的表

问题:在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(); 

和public OrderSearch ()我完全理解它是有道理的,因为当我在CreateOrder.java中调用Object时它会进入无限循环。但有没有办法在CreateOrder.java中访问OrderSearch.java的内容而不会出现stackoverflow错误或再次打开整个新框架OrderSearch.java?

1 个答案:

答案 0 :(得分:0)

不,假设您当前的设置,没有办法做到这一点。这导致我们得出结论,您需要重构代码。主要问题是您的代码无法在不创建框架的情况下执行所需的db命令。您需要separate the engine from the ui。您需要能够执行业务逻辑而不必绑定到UI事件。 UI应该是业务逻辑的用户,而不是其包装器。您需要将所有业务逻辑移动到单独的类中,并在适当的位置和事件中从ui调用相关方法。