2

JFrameで初めて画像を操作していますが、いくつか問題があります。JFrameに画像を配置することに成功しましたが、2秒後にJFrameから画像を削除したいと思います。しかし、2秒後、フレームのサイズを変更するか、最小化してからフレームを最大化しない限り、画像は消えません。できれば助けてください。ありがとう。

コードは次のとおりです。

        File f = new File("2.jpg");

System.out.println( "Picture" + f.getAbsolutePath()); BufferedImage image = ImageIO.read(f); MyBufferedImage img = new MyBufferedImage(image); img.resize(400、300); img.setSize(400、300); img.setLocation(50、50); getContentPane()。add(img);

this.setSize(600、400); this.setLocationRelativeTo(null); this.setVisible(true);

Thread.sleep(2000); System.out.println( "2秒以上");

getContentPane()。remove(img);

MyBufferedImageクラスは次のとおりです。

public class MyBufferedImage extends JComponent{
 private BufferedImage image;

private int nPaint;
private int avgTime;

private long previousSecondsTime;

public MyBufferedImage(BufferedImage b) {
    super();

    this.image = b;

    this.nPaint = 0;
    this.avgTime = 0;

    this.previousSecondsTime = System.currentTimeMillis();
}

@Override
public void paintComponent(Graphics g) {
    Graphics2D g2D = (Graphics2D) g;
    g2D.setColor(Color.BLACK);
    g2D.fillRect(0, 0, this.getWidth(), this.getHeight());

    long currentTimeA = System.currentTimeMillis();


    //g2D.drawImage(this.image, 320, 0, 0, 240, 0, 0, 640, 480, null);
    g2D.drawImage(image, 0,0, null);
    long currentTimeB = System.currentTimeMillis();
    this.avgTime += currentTimeB - currentTimeA;
    this.nPaint++;

    if (currentTimeB - this.previousSecondsTime > 1000) {
        System.out.format("Drawn FPS: %d\n", nPaint++);
        System.out.format("Average time of drawings in the last sec.: %.1f ms\n", (double) this.avgTime / this.nPaint++);
        this.previousSecondsTime = currentTimeB;
        this.avgTime = 0;
        this.nPaint = 0;
    }
}

}

4

5 に答える 5

1

画像を削除してから電話するだけthis.repaint()で、すべてうまくいきます;)

于 2010-05-18T13:27:09.300 に答える
0

おそらく、フレームコンポーネントを無効にして、再描画を強制する必要があります。

おそらくあなたの最善の策は、更新/再描画の方法を調べることです。

于 2010-05-18T11:05:47.333 に答える
0

電話してみましたか

getContentPane()。revalidate();

削除の呼び出しの後?

于 2010-05-18T11:05:04.167 に答える
0

イベントディスパッチスレッドでコンポーネントから画像を削除していることを確認する必要があります。これを試してみてください:

 SwingUtilities.invokeLater(new Runnable() {
         public void run() {
              getContentPane().remove(img);
         }
 }

これが機能imgするには、グローバルであるかfinal、ローカルスコープで宣言されている必要があります。まだ慣れていない場合は、SwingThreadsの概念を確認してください。

注:コンテンツペインが有効であると見なされた場合、 remove呼び出しContainerが呼び出されます。invalidate()

于 2010-05-18T11:17:12.377 に答える
0

SwingUtilities.updateComponentTreeUI(this);ショットを与える

于 2010-05-18T13:38:11.843 に答える