初めてのアプレットを作っています。Swing GUI を作成し、CPU を集中的に使用するタスク (Component 60Hz の再描画) を実行する JPanel があります。私のアプレットは、この JPanel をイベント ディスパッチ スレッドに表示します。ここに問題の抽象化があります。通常、main メソッドを使用する代わりに、html ドキュメントからアプレットを起動します。このプログラムは、私の 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) の実行を一時停止して再開するにはどうすればよいですか? ユーザーが何をしているのかわからない場合、アプレットが CPU の使用を停止するようにします。アプレットで tp.stop() を実行するには、ブラウザ イベントをキャプチャする必要があります。JPanel でウィンドウ イベント リスナを使用して、アプレットで start() メソッドと stop() メソッドをオーバーライドして、それらを実行しようとしました。私は失敗しました。任意の提案や解決策をいただければ幸いです。