0

初めてのアプレットを作っています。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() メソッドをオーバーライドして、それらを実行しようとしました。私は失敗しました。任意の提案や解決策をいただければ幸いです。

4

3 に答える 3

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");
   }
}
于 2012-12-23T22:52:40.777 に答える
2

これにはJSを活用する必要があるようです。EGは、この回答に示されているJSを使用して、フォーカスとぼかしの検出でアプレットstart()とメソッドをそれぞれ明示的に呼び出します。stop()

于 2012-12-24T01:07:22.977 に答える
0

私の問題の解決策は、javascript を使用してPage Visibility APIを実装することでした。次に、JavaScript スクリプト内から適切な Java メソッドを呼び出しました。

于 2012-12-24T21:02:43.980 に答える