3

のアイコンを繰り返し変更して、アニメーション (テキストの回転) を作成しようとしていますJLabel。問題は、画像が同じサイズではなく、最初の画像のサイズよりも大きい場合、クリップされることです。

これを回避する1つの方法はJLabel、すべての画像が収まるように のPreferredSizeを設定することですJPanelが、? を含むJLabel?

以下のコードでは、すべてを一緒に削除しJLabel、新しいものを作成してから新しいものを追加しようとしましたが、同じ効果が得られました。

public class AnimationPanelv2 extends JPanel{

private JButton start = new JButton("Start Animation");
private JLabel img = new JLabel();
private JTextField animSpeed = new JTextField(10);
private JTextField filePrefix = new JTextField(10);
private JTextField noOfImg = new JTextField(10);
private JTextField audioFile = new JTextField(10);
private Timer timer;
private AudioClip clip;
private ArrayList<ImageIcon> icon = new ArrayList<>();
private int step=0;


public AnimationPanelv2() {

    //button is for starting the animation
    start.addActionListener(new Animatie());

    this.setLayout(new BorderLayout());
    add(start, BorderLayout.NORTH);

    //showing the label with the first frame
    Class metaObj = this.getClass();
    URL url = metaObj.getResource("/image/L1.gif");

    img.setIcon(new ImageIcon(url));
//      img.setPreferredSize(new Dimension(500,550));
    add(img, BorderLayout.CENTER);

    //control panel
    JPanel controls = new JPanel(new GridLayout(4,2));

    controls.setBorder(new TitledBorder("Enter information for animation"));

    controls.add(new JLabel("Animation speed in ms"));
    controls.add(animSpeed);
    controls.add(new JLabel("Image file prefix"));
    controls.add(filePrefix);
    controls.add(new JLabel("Number of images"));
    controls.add(noOfImg);
    controls.add(new JLabel("Audio file"));
    controls.add(audioFile);

    //
    add(controls, BorderLayout.SOUTH);
}
private class TimerAnimation implements ActionListener {

    public void actionPerformed(ActionEvent e) {

        remove(img);

        img = new JLabel(icon.get(step++));
        img.setVisible(true);
        add(img, BorderLayout.CENTER);

//          img.revalidate();
//          img.repaint();



        validate();
        repaint();
        updateUI();
        if (step==Integer.parseInt(noOfImg.getText())) step=0;
    }

}
private class Animatie implements ActionListener {

    public void actionPerformed(ActionEvent e) {

        //getting data from the text fields
        int ms = Integer.parseInt(animSpeed.getText());
        String s = filePrefix.getText();
        int nr = Integer.parseInt(noOfImg.getText());
        String audioFilePath = audioFile.getText();

        // clip
        Class metaObj = this.getClass();
        URL url = metaObj.getResource("/audio/"+audioFilePath);
        clip = Applet.newAudioClip(url);

        //image loading
        for (int i=1; i<=nr; i++){
            url = metaObj.getResource("/image/"+s+i+".gif");
            System.out.println("/image/"+s+i+".gif");
            icon.add(new ImageIcon(url));
        }

        //timer
        timer = new Timer(ms, new TimerAnimation());
        timer.start();
        clip.loop();
    }
}

public static void main(String[] args) {

    JFrame jf = new JFrame("This class test");
    jf.setLocationRelativeTo(null);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jf.add(new AnimationPanelv2());
    jf.pack();
    jf.setVisible(true);
}
}

このパネル全体がアプレットで使用されます。

これはスクリーンショットです: http://screencast.com/t/UmqQFZHJVy

フレームと見なされる画像は /images/ サブディレクトリに配置する必要があります。ユーザーがフレーム数にnを入力し、画像プレフィックスに F を入力すると、ファイルは F1、F2 などになります。 、Fn (GIF) に。サウンド ファイルは /audio/ サブディレクトリにある必要があり、ファイル名全体はユーザーが指定します。

4

2 に答える 2

3

各画像のリストを作成JLabelsし、それらをパネルに追加してCardLayoutカードを交換することができます。

于 2012-12-18T11:37:52.503 に答える
3

さて、aJLabelは指定されたコンテンツに合わせて自動的にサイズ変更する必要があるため、JPanel の問題を解決するにgetPreferredSize()は、JPanel含まれているものをオーバーライドし、サイズに応じて sJLabelを返すだけです。DimensionJLabel

public class MyPanel extends JPanel {
JLabel label=...;


    @Override
    public Dimension getPreferredSize() {
        return new Dimension(label.getWidth(),label.getHeight());
    }

}

また、サイズの変更が反映されるように、JLabel呼び出しのアイコンrevalidate()とインスタンスのアイコンを変更するときも忘れないでください。repaint()JPanel

于 2012-12-18T12:49:28.153 に答える