java - 取消选择选项卡时如何在浏览器中暂停 Applet

标签 java javascript swing applet japplet

我正在制作我的第一个小程序。我有一个 JPanel,它创建 Swing GUI 并执行 CPU 密集型任务(重新绘制组件 60Hz)。我的 Applet 在事件调度线程上显示此 JPanel。这是问题的抽象。通常我会从 html 文档启动小程序,而不是使用 main 方法。该程序给我的 CPU 带来了大约 40% 的负载。

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

public class TestApplet extends JApplet {
    TestPanel tp;
    public void init() {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    createGUI();
                }
            });
        } catch (Exception e) { 
            System.err.println("createGUI didn't complete successfully");
        }
    }
    private void createGUI() {
        //Create and set up the content pane.
        tp = new TestPanel();
        tp.setOpaque(true); 
        setContentPane(tp);        
    }

    public static void main(String[] args) {
        JFrame f = new JFrame("Fish Tank");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JApplet ap = new TestApplet();
        ap.init();
        f.add("Center", ap);
        f.pack();
        f.setVisible(true);
    }
}

class TestPanel extends JPanel{
    public TestTank tt = new TestTank();
    public TestPanel() {add(tt);}
    public void stop() {tt.stop();}
    public void start() {tt.start();}
}

class TestTank extends Component implements ActionListener{
    private javax.swing.Timer timer;
    TestTank(){
        timer = new javax.swing.Timer(17, this);
        timer.setCoalesce(true);
        timer.start();
    }
    public Dimension getPreferredSize(){
        return new Dimension(900, 700);
    }
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        Dimension size = getSize();
        g2.setPaint(new GradientPaint(0,0,Color.RED,900, 0,Color.WHITE));
        g2.fill(new Rectangle2D.Float(0,0,size.width,size.height));
    }
    public void actionPerformed(ActionEvent e) {
        repaint();
    }
    public void stop(){timer.stop();}
    public void start(){timer.start();}
}

我的问题:当用户切换选项卡或最小化浏览器时,如何暂停和恢复 JPanel (FishTankPanel) 的执行?我希望 Applet 在用户看不到它在做什么时停止使用 CPU。我需要捕获浏览器事件才能在小程序中执行 tp.stop() 。我尝试使用 JPanel 中的窗口事件监听器以及覆盖 Applet 中的 start() 和 stop() 方法来执行它们。我没有成功。任何建议或解决方案将不胜感激。

最佳答案

我会按照 Dave 所说的那样,使用 JApplet 覆盖启动和停止方法来调用 GUI 方法。例如,查看代码中的更改:

public class TestApplet extends JApplet {
   TestPanel tp;

   public void init() {
      // ... no change
   }

   private void createGUI() {
      // ... no change
   }

   @Override
   public void stop() {
      if (tp != null) {
         tp.stop();
      }
   }

   @Override
   public void start() {
      if (tp != null) {
         tp.start();
      }
   }

}    

class TestTank extends Component implements ActionListener {
   private javax.swing.Timer timer;

   // ... no change

   public void stop() {
      timer.stop();
      System.out.println("stop");
   }

   public void start() {
      timer.start();
      System.out.println("start");
   }
}

关于java - 取消选择选项卡时如何在浏览器中暂停 Applet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14013625/

相关文章:

javascript - 使用 SPservice 创建 slider

javascript - 在 React 中使用 map 从数组渲染时出现错误渲染

java - Hadoop 的输入和输出如何工作?

java - 线程安全的 Spring 数据删除

javascript - 无限循环检查时间

java - 如何将 ImageIcon 设置为 JButton 并根据按钮的大小调整图片大小?

java - 如何多次创建对象以在屏幕上同时移动?

java - 如何清除jtable中的数据

java - WebView SSL 错误?

java - 如何在数组中仅保留唯一值?