java componentlistener_java – 带有ComponentListener的JPanel

我有一个主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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值