私はこの問題に苦労しています。つまり、OrderSearch.java
(メインクラス)とCreateOrder.java
という2つのクラスがあります。私のメインclass
にJTable
があり、行がダブルクリックされると、新しいテキストが開きます。CreateOrder.java
とjTable
というテキストフィールドがあります。 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全体を再度開く必要はありませんか?
おそらくあなたのコードをリファクタリングして、SQLが別のクラスにあるようにして –
@ScaryWombatと答えてもらえますか?しかし、jTableについてはどうですか? 私はクラス 'リフレッシュOrderSearch {}'クラスを作成する場合は、再びstackoverflowエラーを私に与えるつもりです。申し訳ありませんが、私はJavaのnewbyです – Ajay
なぜあなたは 'OrderSearch'を拡張したいのですか?このリファクタリングされたコードは、私の心の中で、あなたが接続しているものに関係なくスタンドアロンにできるはずです。疎結合コードが目的です –