当前位置: 首页 > 知识库问答 >
问题:

调整JPanel大小以适应新的JLabel图标

仉英朗
2023-03-14

我试图通过反复更改jlabel上的图标来创建一个动画(旋转文本)。问题是这些图像的大小不相同,当它们大于第一个图像的大小时,它们就会被裁剪。

解决这一问题的一种方法是为JLabel设置PreferredSize以便所有图像都适合--但我想一定有一种方法可以直接调整包含JLabelJPanel的大小?

在下面的代码中,我还尝试将jlabel全部删除,创建一个新的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);
}
}

整个面板将在一个applet中使用。

这是截图:http://screencast.com/t/umqqfzhjvy

假定为帧的图像应该位于/images/子目录中,如果用户输入帧数为n,输入图像前缀为F,则文件为F1、F2等等,直到Fn(GIFs)。声音文件应该在/audio/子目录中,整个文件名由用户给出。

共有1个答案

呼延震博
2023-03-14

您可以尝试为每个图像创建JLabels列表,将它们添加到带有CardLayout和交换卡的面板中。

 类似资料:
  • 我正在尝试使图片适合JLabel。我希望将图片尺寸缩小到更适合我的Swing JPanel的尺寸。 我尝试使用setPreferredSize,但它不起作用。 我在想有没有一个简单的方法来做这件事?我应该为此缩放图像吗?

  • 起初,我只有文本栏和状态栏,如下例所示(我不需要父容器): 这是应该的。但是,请记住状态栏的高度。现在,如果您将StatusBar类更改为下面的类,那么高度几乎会增加一倍。为什么会这样? 这种设置并不需要更多的垂直空间: 我可以让这成为一个新问题,但我觉得不值得...

  • 下面是“DisplayImage”自定义面板相关部分的代码:

  • 问题内容: 我正在尝试从目录加载图像并将其作为图标放置在中。但是,当图像尺寸很大时,就不能完全放入标签中。我尝试调整图像的大小以适合标签,但无法正常工作。我可以知道我要去哪里了吗? 问题答案: BufferedImage img = ImageIO.read(…); Image scaled = img.getScaledInstance(500, 500, Image.SCALE_SMOOTH)

  • 问题内容: 我正在尝试使图片适合JLabel。我希望将图片尺寸减小到更适合我的Swing JPanel。 我尝试使用setPreferredSize,但是它不起作用。 我想知道是否有一种简单的方法?我应该为此缩放图像吗? 问题答案: 大纲 这是要遵循的步骤。 将图片读取为BufferedImage。 将BufferedImage的大小调整为另一个JLabel大小的BufferedImage。 从调

  • 我对JPanel和JFrame还是个新手,可能没有按照我应该的方式使用它们。我正在尝试创建Pong游戏,在创建JFrame并将JPanel添加到它之后,我可以调整JPanel的大小,但我不知道如何调整JFrame的大小以适应它。Game类扩展了JPanel。 主: 编辑: 将setSize更改为setPreferredSize,然后为JFrame调用pack()就可以解决所有问题。