Java - 使用 Swing 创建连续的图像幻灯片

自由e97

我不确定如何在标题中正确命名我的问题,但我希望我的图片可以表达我正在寻找的内容:

https://i.stack.imgur.com/fIhP8.png

所以我想要完成的是,例如你有两张图片,如上所示,还有一个旁边有幻灯片的对象[在图片中命名为 (1)]

根据幻灯片 (1) 的进度/值,是否IMAGE A 滑动IMAGE B 会弹出

一旦幻灯片到达底部,IMAGE B将完全接管显示区域,而IMAGE A被隐藏。反之亦然,幻灯片上升到顶部。

有没有想法如何在 Swing 中用 Java 创建这样的东西?我希望我的解释足够准确,可以理解。

感谢您的帮助 :)

编辑 1:这是我实现的代码 @camickr 我认为它应该只通过设置视图面板来工作。我按照你的指示做错了吗?

JPanel bigPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 20));
JPanel displayPanel = new JPanel();
JScrollPane scrollPane = new JScrollPane();
[...] 
displayPanel.setLayout(new BoxLayout(displayPanel, BoxLayout.X_AXIS));
JLabel label1 = new JLabel(new ImageIcon("R:\\imgA.jpg"));
JLabel label2 = new JLabel(new ImageIcon("R:\\imgB.jpg"));
displayPanel.add(label1);
displayPanel.add(label2);
scrollPane.setViewportView(displayPanel);
bigPanel.add(scrollPane);
马可13

为了对图像的绘制方式进行一些控制,我建议为此创建一个自己的面板,并drawImage在覆盖的paintComponent方法中使用调用图像的“位置”最好应该是一个相对值——即double介于 0.0(显示第一张图像)和 1.0(显示第二张图像)之间值,与分辨率和图像大小无关。

这里关于图像大小一个警告,虽然:一个人必须假定这两个图像的大小是一样的。否则,您将在如何处理不同图像大小的问题上打开一大堆蠕虫。此外,当包含组件大于或小于图像时,应该有一定的自由度。但为简单起见,可以假设它始终具有正确的尺寸。

一个简单的实现可能如下所示:

图像幻灯片

这是相应的代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class ImageSlideTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        BufferedImage image0 = createImage("Image 0", Color.RED);
        BufferedImage image1 = createImage("Image 1", Color.GREEN);

        ImageSlidePanel imageSlidePanel = new ImageSlidePanel(image0, image1);
        JPanel panel = new JPanel(new BorderLayout());

        panel.add(imageSlidePanel, BorderLayout.CENTER);

        JSlider slider = new JSlider(SwingConstants.VERTICAL, 0, 100, 0);
        slider.addChangeListener(e -> 
        {
            double location = slider.getValue() / 100.0;
            imageSlidePanel.setLocation(location);
        });
        panel.add(slider, BorderLayout.EAST);

        f.getContentPane().add(panel);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static BufferedImage createImage(String text, Color color)
    {
        int w = 300;
        int h = 200;
        BufferedImage image =
            new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = image.createGraphics();
        g.setColor(color);
        g.fillRect(0, 0, w, h);
        g.setColor(Color.BLACK);
        g.setFont(new Font("Dialog", Font.PLAIN, 30));
        g.drawString(text, 50, 50);
        g.dispose();
        return image;
    }
}

class ImageSlidePanel extends JPanel
{
    private final BufferedImage image0;
    private final BufferedImage image1;
    private double location;

    // Note: The images should have the same size...
    public ImageSlidePanel(BufferedImage image0, BufferedImage image1)
    {
        this.image0 = image0;
        this.image1 = image1;
        this.location = 0.0;
    }

    public void setLocation(double location)
    {
        this.location = Math.min(1.0, Math.max(0.0, location));
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        int dx = (int) (image0.getWidth() * location);
        g.drawImage(image0, -dx, 0, null);
        g.drawImage(image1, -dx + image0.getWidth(), 0, null);
    }

    @Override
    public Dimension getPreferredSize()
    {
        if (isPreferredSizeSet())
        {
            return super.getPreferredSize();
        }
        int w = image0.getWidth();
        int h = image0.getHeight();
        return new Dimension(w, h);
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用viewpager的图像幻灯片

来自分类Dev

使用 JFrame 的图像幻灯片

来自分类Dev

如何使用fancyBox创建幻灯片?

来自分类Dev

Java Swing:无法使用getResource加载图像

来自分类Dev

如何使用自动布局在scrollview中创建图像的幻灯片显示?

来自分类Dev

使用PHP动态创建引导模态中的图像幻灯片

来自分类Dev

如何使用Pure Javascript或Pure Javascript库创建背景图像的幻灯片

来自分类Dev

使用缩放和淡入/淡出创建FFmpeg图像幻灯片

来自分类Dev

Adobe Edge Animate使用自动播放的图像计数创建幻灯片

来自分类Dev

使用Swing Java绘画

来自分类Dev

使用Java Swing打印

来自分类Dev

使用Swing Java绘画

来自分类Dev

从图像的右中心使用 jquery 的图像幻灯片

来自分类Dev

使用SDWebImage下载的图像中的UIImageView幻灯片

来自分类Dev

使用滑块手柄拖动图像幻灯片

来自分类Dev

使用jQuery在幻灯片放映中的FadeIn()图像

来自分类Dev

使用画布HTML5的图像幻灯片

来自分类Dev

使用SDWebImage下载的图像的UIImageView幻灯片显示

来自分类Dev

使用javascript更改backgroundImage以进行图像幻灯片显示。

来自分类Dev

使用avconv生成视频幻灯片,但保持图像比例

来自分类Dev

在 boostrap carousel 中使用图像而不是幻灯片的背景

来自分类Dev

什么是从 JSP 创建 powerpoint 幻灯片的 Java 库

来自分类Dev

使用JS / jQuery创建“幻灯片”效果

来自分类Dev

如何使用fancyBox创建幻灯片显示?

来自分类Dev

使用JS / jQuery创建“幻灯片”效果

来自分类Dev

如何使用按钮创建自动幻灯片

来自分类Dev

Java Swing:使用填充创建自定义JComponent的网格

来自分类Dev

使用Java Swing进行布局

来自分类Dev

使用Swing Worker拖放Java

Related 相关文章

热门标签

归档