2017-10-17 5 views
1

私はこの問題に苦労しています。つまり、OrderSearch.java(メインクラス)とCreateOrder.javaという2つのクラスがあります。私のメインclassJTableがあり、行がダブルクリックされると、新しいテキストが開きます。CreateOrder.javajTableというテキストフィールドがあります。 CreateOrder.javaにSaveButtonがあり、クラスに加えられた変更が保存され、再びJTableが表示されます。2つの異なるクラスのオブジェクトを作成すると、JavaでStackOverflowがスローされます

しかし、問題は私がSaveButtonがクリックされたときにいくつかのSQLクエリをリフレッシュするテーブル操作を実行することができないことです。 CreateOrderのsavebuttonをクリックすると、OrderSearchがリフレッシュされます。

問題:CreateOrder.javaでOrderSearch.javaクラスのオブジェクトを作成すると、私にスタックオーバーフローエラーが発生します。 Saveボタンでオブジェクトを作成すると、新しいフレーム全体が再度開きます。

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* 

     } 
    }); 

} 
} 

は、どのように私は再びフレームを開かずに方法refresh()をアクセスもするCreateOrderにOrderSearchのオブジェクトを作成する必要がありますか?

ありがとうございます!

-Ajay

EDIT:

実際にエラーが

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

関連する問題