我一直在努力解决这个问题,我有两个类,即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?
答案 0 :(得分:0)
不,假设您当前的设置,没有办法做到这一点。这导致我们得出结论,您需要重构代码。主要问题是您的代码无法在不创建框架的情况下执行所需的db命令。您需要separate the engine from the ui。您需要能够执行业务逻辑而不必绑定到UI事件。 UI应该是业务逻辑的用户,而不是其包装器。您需要将所有业务逻辑移动到单独的类中,并在适当的位置和事件中从ui调用相关方法。