我正在制作我的第一个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()方法。我没有成功。任何建议或解决方案将不胜感激。
答案 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方法。