Java GUI小程序之图片浏览器
以下是一个简单的图片浏览器示例代码,它包含了图片放大缩小、拖拽、上一张/下一张查看等功能。你可以根据它进行扩展,提高用户体验。
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 levelpublic ImageViewer() {setTitle("Image Viewer");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setPreferredSize(new Dimension(800, 600));setLayout(new BorderLayout());// Create image label and scroll paneimageLabel = new JLabel();imageLabel.setHorizontalAlignment(SwingConstants.CENTER);scrollPane = new JScrollPane(imageLabel);add(scrollPane, BorderLayout.CENTER);// Create control panelcontrolPanel = new JPanel();controlPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));add(controlPanel, BorderLayout.SOUTH);// Create zoom sliderzoomSlider = 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 buttonpreviousButton = new JButton("Previous");previousButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (currentImageIndex > 0) {currentImageIndex--;loadImage();}}});controlPanel.add(previousButton);// Create next buttonnextButton = 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 imageloadImage();// Add mouse listeners to enable draggingimageLabel.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();}}
运行效果如下:

相关文章:
Java GUI小程序之图片浏览器
以下是一个简单的图片浏览器示例代码,它包含了图片放大缩小、拖拽、上一张/下一张查看等功能。你可以根据它进行扩展,提高用户体验。 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.e…...
Kafka-4.1-工作原理综述
1 Kafka工作原理详解 1.1 工作流程 Kafka集群将 Record 流存储在称为 Topic 的类中,每个记录由⼀个键、⼀个值和⼀个时间戳组成。 Kafka 中消息是以 Topic 进⾏分类的,⽣产者⽣产消息,消费者消费消息,⾯向的都是同⼀个Topic。Topi…...
Linux八股文
Linux八股文 第一章 Linux简介 Linux是一种多用户、多任务,支持多线程和多CPU的操作系统,具有免费、稳定、高效的优点,一般运行在大型服务器上。 1.1 常用目录 目录说明/根目录,有且仅有一个,一般只存放目录/home家目…...
SPASS-偏相关分析
基本概念 偏相关分析的任务就是在研究两个变量之间的线性相关关系时控制可能对其产生影响的变量,这种相关系数称为偏相关系数。偏相关系数的数值和简单相关系数的数值常常是不同的,在计算简单相关系数时,所有其他自变量不予考虑。 统计原理 控制一个变量和控制两个变量的偏…...
第二证券:今日投资前瞻:小米汽车引关注 全球风光有望持续高速发展
昨日,两市股指盘中轰动上扬,深成指、创业板指一度涨超1%。到收盘,沪指涨0.55%报3072.83点,深成指涨0.72%报10077.96点,创业板指涨0.53%报2015.36点,北证50指数涨2.64%;两市算计成交9900亿元&…...
Docker中的RabbitMQ已经启动运行,但是管理界面打不开
文章目录 前言一、解决方法方法一方法二 总结 前言 肯定有好多小伙伴在学习RabbitMQ的过程中,发现镜像运行,但是我的管理界面怎么进不去,或者说我第一天可以进去,怎么第二天进不去了,为什么每次重新打开虚拟机都进不去…...
自动化网络图软件
由于 IT 系统的发展、最近向混合劳动力的转变、不断变化的客户需求以及其他原因,网络监控变得更加复杂。IT 管理员需要毫不费力地可视化整个网络基础设施,通过获得对网络的可见性,可以轻松发现模式、主动排除故障、确保关键设备可用性等。 为…...
如何基于亚马逊云科技打造高性能的 SQL 向量数据库 MyScale
MyScale 是一款完全托管于亚马逊云科技,支持 SQL 的高效向量数据库。MyScale 的优势在于,它在提供与专用向量数据库相匹敌甚至优于的性能的同时,还支持完整的 SQL 语法。在这篇文章中,我们将阐述 MyScale 是如何借助亚马逊云科技的…...
《轻松入门!快速安装PyCharm,打造高效Python编程环境》
「Pycharm安装包和相关插件(Windows 64位)」https://www.aliyundrive.com/s/jByv6vjShVz 提取码: 1234 视频教程:https://www.douyin.com/video/7303106933521763596?previous_pageapp_code_link 第一步:找到一起下载的Pycharm安…...
Golang环境搭建Win10(简洁版)
Golang环境搭建Win10 Golang环境搭建(Win10)一、前言二、Golang下载三、配置环境变量3.1、配置GOROOT3.2、配置GOPATH3.3、配置GOPROXY代理 Golang环境搭建(Win10) 一、前言 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken…...
【算法每日一练]-分块(保姆级教程 篇1)POJ3648
插讲一下分块 题目:(POJ 3648) 一个简单的整数问题 前缀和往往用于静态的不会修改的区间和。遇到经常修改的区间问题,就要用分块或线段树来维护了。 分块算法是优化后的暴力,分块算法有时可以维护一些线段树维护不了的…...
【华为OD题库-026】通过软盘拷贝文件-java
题目 有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究。但此电脑除了有一个3.5寸软盘驱动器以外,没有任何手段可以将文件拷贝出来,而且只有一张软盘可以使用。因此这一张软盘是唯一可以用来拷贝文件的载体。科学家想要尽可能多地将计算…...
定量数据和定性数据
定量数据本质上是数值,应该是衡量某样东西的数量。 定性数据本质上是类别,应该是描述某样东西的性质。 全部的数据列如下,其中既有定性列也有定量列; import pandas as pdpd.options.display.max_columns None pd.set_option(e…...
【Linux】:体系结构与进程概念
朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux体系结构和进程的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入…...
react-router-dom 版本6.18.0中NavLink的api和属性介绍
React Router 是一个基于 React 的路由库,它可以帮助我们在 React 应用中实现页面的切换和路由的管理。而 NavLink 则是 React Router 中的一个组件,它可以帮助我们实现导航栏的样式设置和路由跳转。 在 React Router 版本6.18.0 中,NavLink…...
八叉树(Octree)和KD树区别?2d tree与3d tree区别?
一、八叉树(Octree)和KD树 八叉树(Octree) 结构:八叉树是一种用于三维空间数据的树状结构,每个分支节点恰好有八个子节点。每个节点代表空间中的一个立方体区域,这个立方体区域被均匀地分割成…...
Union(联合体、共用体)
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。 结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能…...
C++11的互斥包装器
文章目录 1. 为何要引入互斥包装器?2. lock_guard3. unique_lock4. 两者之间的不同5. 总结 1. 为何要引入互斥包装器? 在C多线程中会经常用到mutex,在使用的时候lock后,有时候会忘记使用unlock进行解锁造成死锁,或者在…...
HR应用在线人才测评,给企业招聘带来的好处
一、什么是人才测评? 人才测评是指运用一系列的科学方法,对人的基本素质,专业能力,心理健康,性格进行选拔,评价及发展人才的一种科学方法。近十多年,它被广泛运用于国有大型企业的人才招聘和人…...
深入了解百度爬虫工作原理
在当今数字化时代,互联网已经成为人们获取信息的主要渠道之一。而搜索引擎作为互联网上最重要的工具之一,扮演着连接用户与海量信息的桥梁角色。然而,我们是否曾经好奇过当我们在搜索引擎中输入关键词并点击搜索按钮后,究竟是如何…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
