我有一个主JPanel,其布局设置为CardLayout.
主JPanel有4张卡:Card1JPanel,Card2JPanel,Card3JPanel,Card4JPanel.
我还有一个名为“MySwingy”的SwingWorker类,它的循环标志设置为true时会永久执行某些操作.
当Card1JPanel是VISIBLE / SHOWN时,我想执行MySwingy worker.
当Card1JPanel不可见/隐藏时,我想阻止MySwingy工作人员;
以下是我目前的代码,我想知道是否有更好/更清洁的方法来解决上述问题.在下面的代码示例中,您将看到我使用CardlJPanel的ComponentListener来检测它是显示还是隐藏,但是如果我有很多卡,每个都有自己的ComponentListener事件,那么这些事件监听器会减慢我的应用程序的速度吗?
非常感谢你
public class Card1JPanel extends JPanel{
private MySwingy mySwingy;
private JTable tableDatabase;
public Card1JPanel(){
initComponents();//tableDatabase is drawn here among other things
this.addComponentListener(new myListener());
}
class myListener implements ComponentListener {
@Override
public void componentHidden(ComponentEvent e) {
try{
mySwingy.stopExecuting();//A flag inside of the worker gets set to false that terminates the while(true) loop.
}catch(NullPointerException ex){
}
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentResized(ComponentEvent e) {
}
@Override
public void componentShown(ComponentEvent e) {
mySwingy = new MySwingy(tableDatabase);
mySwingy.execute();
}
}
}
编辑:显示mySwingy的作用:
MySwingy用于解析SQL数据库中的数据,并在数据库中的数据发生更改时更新tableDatabase. tableDatabase位于Card1JPanel上,并使用SwingUtilities.InvokeLater在MyTwingy的EDT上更新.在我的应用程序中,我有许多带有JTable和SwingWorkers的卡(JPanel),它们在EDT上更新它们的JTable.现在,我确信如果所有这些JTable都在他们的SwingWorkers上不断更新,那么GUI将会冻结.因此,当JPanel不可见时,如何阻止SwingWorker更新JTable?这是我的问题.
public class MySwingy extends SwingWorker{
private JTable tableDatabase;
private boolean isStopExecuting;
private boolean isDatabaseDataChanged;
public MySwingy(JTable tableDatabase){
this.tableDatabase = tableDatabase
isStopExecuting = false;
isDatabaseDataChanged = false;
}
public void stopExecuting(){
isStopExecuting = true;
}
@Override
public Void doInBackground(){
while(isStopExecuting == false){
//Here is the code that parses some data from an SQL database and if the data in the SQL database
//has changed the isDatabaseDataChanged boolean flag is set to true,
//else isDatabaseDataChanged boolean flag is set to false;
if(isDatabaseDataChanged == true){
isDatabaseDataChanged = false;
SwingUtilities.InvokeLater(new Runnable(){
@Override
public void run(){
//Update tableDatabase rows with new data
}
});
}
}
return null;
}
}