7

paintComponent()の背景にgifアニメーション画像をペイントするために使用していJPanelます。gifは表示されますが、アニメーション化されません。私はJava1.5を使用していますが、アイコン付きのラベルを使用できることを知っています。

誰かがそれを修正する理由と方法を知っていますか?

    private static class CirclePanel extends JPanel {

    ImageIcon imageIcon = new ImageIcon(BarcodeModel.class.getResource("verify.gif"));
    Point point = f.getLocation();
    protected void paintComponent(Graphics g) {
        Graphics gc = g.create();
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
        g2d.setColor(Color.BLUE);
        g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, null);
        g2d.drawRect(0, 0, getWidth(), getHeight());
        g2d.setStroke(new BasicStroke(10f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER));
        g2d.setFont(g.getFont().deriveFont(Font.BOLD | Font.ITALIC,15f));
        g2d.drawString("Wait Please ...",getWidth()/2-imageIcon.getIconHeight()/3,getHeight()/2+imageIcon.getIconHeight()+15);

        g2d.dispose();

}

これはgif画像です。
ここに画像の説明を入力してください

編集: g2d.drawImage()メソッドに画像オブザーバーを追加するだけです。

 g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, this);
4

2 に答える 2

9

その理由は、標準のJavaImageIOAPIはgifの最初の画像のみをロードするためです。直し方?Google for Gif Loader for Javaは、gifのすべての画像を読み込みます。次に、適切なタイミングで適切な画像をペイントする必要があります。別の方法は、アニメーションの1フレームごとに異なるpngファイルを作成することです。

更新:ええと...実際、いくつかの調査を行った後、実際にアニメーションGIFのすべてのフレームをロードしたように見えます。その理由は、ImageIconのメソッドgetImage()が常に最初の画像を返すためです。

それを修正するには、これを試すことができます(それが機能するかどうかはわかりません...)

を使用する代わりに、をGrahpics.drawImage()使用してImageIcon.paintIcon()ください。このような:

imageIcon.paintIcon(this, g2d, getWidth() / 2 - imageIcon.getIconWidth() / 2, getHeight() / 2);
于 2012-07-25T11:34:02.777 に答える
4

画像観察者が面倒を見てくれます。オブザーバーをg2d.drawImage();以下のようにパスするだけです。

g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, this);

私の場合、「これ」はJPanelを拡張するCirclePanelを指します。たとえば、ボタンのアイコンとしてgifを使用している場合は、画像オブザーバーとしてボタンを使用する必要があります。

于 2012-07-25T12:10:03.257 に答える