gpt4 book ai didi

java - 带有 ComponentListener 的 JPanel

转载 作者:搜寻专家 更新时间:2023-11-01 02:50:21 25 4
gpt4 key购买 nike

我有一个 Main JPanel,其布局设置为 CardLayout。

Main JPanel 有 4 个卡片:Card1JPanel、Card2JPanel、Card3JPanel、Card4JPanel。

我还有一个名为“MySwingy”的 SwingWorker 类,它会在其循环标志设置为 true 时永远执行某些操作。

当 Card1JPanel 可见/显示时,我想执行 MySwingy worker。

当 Card1JPanel 不可见/隐藏时,我想停止 MySwingy worker;

以下是我目前拥有的代码,我想知道是否有更好/更简洁的方法来解决上述问题。在下面的代码示例中,您将看到我使用 Card1JPanel 的 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 在 MySwingy 的 EDT 上更新。在我的应用程序中,我有许多带有 JTables 和 SwingWorkers 的卡片 (JPanel),它们在 EDT 上更新它们的 JTables。现在,我确信如果所有这些 JTable 都在 EDT 上从它们的 SwingWorker 不断更新,GUI 将会卡住。因此,当 JPanel 不可见时,如何阻止 SwingWorker 更新 JTable?这是我的问题。

public class MySwingy extends SwingWorker<Void,Void>{

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;

}
}

最佳答案

不要切换 worker ;让它运行。相反,只有当 View isVisible() 时才有条件地更新 View ,可以直接通过 process() 或通过属性更改间接进行。

附录:一些有用的评论值得仔细研究。

  • 正如@Andrew 指出的那样,很大程度上取决于工作人员的任务。人们可能会在后台线程上演化模拟模型,但任何渲染必须发生在 event dispatch thread 上。 .

  • 我和@mKorbel 一样困惑;你要求对解决方案进行批判性评估,但没有说明它要解决什么问题。

  • @kleopatra 指出 SwingWorker 被设计为 executed only once .任何从另一个线程控制 doInBackground() 循环的尝试都很难同步。还要检查您的任务的预期延迟,提到 here . javax.swing.Timer 的一个实例,它公开了 start()stop() 方法,可能是一个替代方案。

  • Updated question :如果您的工作人员需要轮询具有可变延迟的数据源,请在后台线程中使用 java.util.Timer 以可持续的速度执行触发器查询。

关于java - 带有 ComponentListener 的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12327254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com