如何取消选中选项卡时,如何在浏览器中挂起Applet

时间:2012-12-23 18:40:57

标签: java javascript swing applet japplet

我正在制作我的第一个Applet。我有一个JPanel,它创建一个Swing GUI并执行CPU密集型任务(重新绘制60Hz的组件)。我的Applet在事件派发线程上显示此JPanel。这是问题的抽象。通常我会从一个html文档启动applet而不是一个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。我需要捕获浏览器事件才能在applet中执行tp.stop()。我试图在JPanel中使用窗口事件侦听器执行它们,并通过覆盖Applet中的start()和stop()方法。我没有成功。任何建议或解决方案将不胜感激。

3 个答案:

答案 0 :(得分:2)

我会这样做,因为Dave说并使用JApplet覆盖start和stop方法来调用你的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");
   }
}

答案 1 :(得分:2)

看来你可能需要利用一些JS来实现这个目标。例如。使用this answer中显示的JS明确调用applet start()&关注焦点的stop()方法&模糊检测。

答案 2 :(得分:0)

我的问题的解决方案是使用javascript来实现Page Visibility API。然后我从javascript脚本中调用了适当的Java方法。