根据主题,我在从 JButton 的 actionPerformed 方法更新 GUI 元素时遇到问题。我在该主题中找到: 在 actionPerformed 方法中的线程睡眠 ,要更新 GUI,我必须从 actionPerformed 返回。所以这对我来说是个问题,因为我的 JButton 代码是:
public class JButtonINVOICES extends JButton
{
private static final long serialVersionUID = 1L;
public JButtonINVOICES(...)
{
addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
mainFrameReference.setInvoiceRegisterPanel();
invoiceRegisterPanelReference.updateInvoiceList(...);
}
});
}
}
单击按钮后,setInvoiceRegisterPanel()
只需将我的面板设置在主框架上即可。Panel 包含 JTable 组件。到目前为止一切正常,但第二种方法updateInvoiceList(...)
负责更新添加面板上的 JTable 组件。到现在也一切正常。当我将 JProgressBar 添加到我的面板并尝试在执行第二种方法时更新该 progressBar 时,会出现问题。它不起作用,因为我在 actionPerformed 方法中没有更新 GUI。所以我的问题是如何处理它,因为我无法观察到我的 JProgressBar 加载。它出现在所有 JTable 加载完毕并且 progressBar 的值为 100% 之后。我希望我解释清楚。
updateInvoiceList 代码:(pb 是 JProgressBar 对象)
public void updateInvoiceList(int month, int year)
{
Vector<String> v;
int num = 0;
int amountToLoad = getAmountToLoad(month,year);
pb.setMinimum(0);
pb.setMaximum(amountToLoad);
if(amountToLoad==0)
{
pb.setMaximum(1);
pb.setValue(1);
clearProductTable();
return;
}
Connection conn = Connector.getConnection();
clearProductTable();
try
{
PreparedStatement prep = conn.prepareStatement("select * from Invoices where print_date like ? and print_date like ?;");
prep.setString(1, "%."+month+".%");
prep.setString(2, "%."+year+" %");
ResultSet rs = prep.executeQuery();
while (rs.next())
{
num++;
v = new Vector<>();
v.addElement(Integer.toString(num));
String number = rs.getString(2);
v.addElement("<html><b>FV / "+number+" / "+rs.getString(3)+"</b></html>");
v.addElement(findClient(rs.getString(6)));
String[] date = getSellDate(rs.getInt(1));
v.addElement(date[0]);
v.addElement(date[1]);
v.addElement(rs.getString(7));
v.addElement(rs.getString(8));
v.addElement(number);
pb.setValue(num);
try{Thread.sleep(30);} catch (InterruptedException e){}
model.addRow(v);
}
rs.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}