Java 从actionPerformed返回后会显示GUI更改
根据这个主题,我在从JButton的actionPerformed方法更新GUI元素时遇到了问题。我在这个话题中发现: 要更新GUI,我必须从Activomperformed返回。这对我来说是个问题,因为我的JButton代码是:Java 从actionPerformed返回后会显示GUI更改,java,database,swing,prepared-statement,jprogressbar,Java,Database,Swing,Prepared Statement,Jprogressbar,根据这个主题,我在从JButton的actionPerformed方法更新GUI元素时遇到了问题。我在这个话题中发现: 要更新GUI,我必须从Activomperformed返回。这对我来说是个问题,因为我的JButton代码是: public class JButtonINVOICES extends JButton { private static final long serialVersionUID = 1L; public JButtonINVOICES(...) { addA
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只是在我点击我的按钮后,将我的面板设置为在主框架上可见。面板包含JTable组件。到目前为止一切正常,但第二个方法updateInvoiceList。。。负责更新添加面板上的JTable组件。到目前为止,一切都很好。当我将JProgressBar添加到面板并在执行第二个方法时尝试更新该progressBar时,就会出现问题。它不起作用,因为GUI没有更新,因为我使用的是actionPerformed方法。所以我的问题是如何处理这个问题,因为我无法观察我的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();
}
}
你能用你的JProgressBar显示代码吗?1为了更快地获得更好的帮助,请发布一个。2不要阻止EDT事件调度线程-发生这种情况时GUI将“冻结”。不要调用Thread.sleepn,而是为重复任务实现一个Swing计时器,或为长时间运行的任务实现一个SwingWorker。有关更多详细信息,请参阅。谢谢您的帮助。我还有一个问题。我启动SwingWorker线程如下:new MyThread.execute;这样合适吗?我想知道doInBackground方法是否完成了,是我自己销毁线程对象还是它自动销毁?谢谢