Java GUI小程序之图片浏览器

以下是一个简单的图片浏览器示例代码,它包含了图片放大缩小、拖拽、上一张/下一张查看等功能。你可以根据它进行扩展,提高用户体验。

java 复制代码
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ImageViewer extends JFrame {

    private static final long serialVersionUID = 1L;
    private JLabel imageLabel;
    private JScrollPane scrollPane;
    private BufferedImage image;
    private Dimension imageSize;
    private JPanel controlPanel;
    private JSlider zoomSlider;
    private JButton previousButton;
    private JButton nextButton;

    private int currentImageIndex = 0;
    private String[] imagePaths = {"image1.jpg", "image2.jpg", "image3.jpg"};

    private int zoomLevel = 100; // Default zoom level

    public ImageViewer() {
        setTitle("Image Viewer");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(800, 600));
        setLayout(new BorderLayout());

        // Create image label and scroll pane
        imageLabel = new JLabel();
        imageLabel.setHorizontalAlignment(SwingConstants.CENTER);
        scrollPane = new JScrollPane(imageLabel);
        add(scrollPane, BorderLayout.CENTER);

        // Create control panel
        controlPanel = new JPanel();
        controlPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        add(controlPanel, BorderLayout.SOUTH);

        // Create zoom slider
        zoomSlider = new JSlider(SwingConstants.HORIZONTAL, 50, 200, zoomLevel);
        zoomSlider.setMajorTickSpacing(50);
        zoomSlider.setMinorTickSpacing(10);
        zoomSlider.setPaintTicks(true);
        zoomSlider.setPaintLabels(true);
        zoomSlider.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                zoomLevel = zoomSlider.getValue();
                updateImage();
            }
        });
        controlPanel.add(zoomSlider);

        // Create previous button
        previousButton = new JButton("Previous");
        previousButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (currentImageIndex > 0) {
                    currentImageIndex--;
                    loadImage();
                }
            }
        });
        controlPanel.add(previousButton);

        // Create next button
        nextButton = new JButton("Next");
        nextButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (currentImageIndex < imagePaths.length - 1) {
                    currentImageIndex++;
                    loadImage();
                }
            }
        });
        controlPanel.add(nextButton);

        // Load the first image
        loadImage();

        // Add mouse listeners to enable dragging
        imageLabel.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                imageLabel.setCursor(new java.awt.Cursor(java.awt.Cursor.MOVE_CURSOR));
            }

            public void mouseReleased(MouseEvent e) {
                imageLabel.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
            }
        });
        imageLabel.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                int dx = e.getX() - (imageSize.width - scrollPane.getViewport().getWidth()) / 2;
                int dy = e.getY() - (imageSize.height - scrollPane.getViewport().getHeight()) / 2;

                int newHValue = scrollPane.getHorizontalScrollBar().getValue() - dx;
                int newVValue = scrollPane.getVerticalScrollBar().getValue() - dy;

                if (newHValue < 0)
                    newHValue = 0;
                if (newVValue < 0)
                    newVValue = 0;
                if (newHValue + scrollPane.getViewport().getWidth() > imageSize.width)
                    newHValue = imageSize.width - scrollPane.getViewport().getWidth();
                if (newVValue + scrollPane.getViewport().getHeight() > imageSize.height)
                    newVValue = imageSize.height - scrollPane.getViewport().getHeight();

                scrollPane.getHorizontalScrollBar().setValue(newHValue);
                scrollPane.getVerticalScrollBar().setValue(newVValue);
            }
        });

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

    private void loadImage() {
        try {
            image = ImageIO.read(new File(imagePaths[currentImageIndex]));
            imageSize = new Dimension(image.getWidth(), image.getHeight());
            updateImage();
        } catch (IOException e) {
            JOptionPane.showMessageDialog(this, "Error loading image: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void updateImage() {
        int newWidth = (int) (imageSize.width * zoomLevel / 100.0);
        int newHeight = (int) (imageSize.height * zoomLevel / 100.0);

        BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
        scaledImage.getGraphics().drawImage(image, 0, 0, newWidth, newHeight, null);

        imageLabel.setIcon(new ImageIcon(scaledImage));
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            // Ignore
        }
        new ImageViewer();
    }

}

运行效果如下:

相关推荐
Ai-_Man6 分钟前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd9 分钟前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
王中阳Go14 分钟前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
BK贝壳25 分钟前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
学逆向的40 分钟前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_1 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
supabc1232 小时前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
ZhengEnCi3 小时前
AI Agent工具调用防护层怎么写-一份能直接跑的Python四层拦截实现
python·llm·agent
ZhengEnCi3 小时前
AI Agent工具误调用怎么解决-从参数校验到高危二次确认的四层工程防线
python·llm·agent
镜子AI4 小时前
镜子AI工程教程:用Python实现关键词布局检查器与语义改写查重(附完整代码)
人工智能·python·microsoft