JAVA设置新视口,java – 在更大的图像上移动视口; JLablel JScrollPane

这是一个非常基本的例子.它使用一个图像文件并将其放置在一个滚动窗格内(在一个圆形的方式).

从那里,它只是使用Swing Timer来随机生成点(在图像的边界内).

每次生成一个新点时,我只需使用scrollToRectVisible,传递它想要渲染的点的位置和大小.这将确保新点(和点)在滚动窗格中可见.

import java.awt.Color;

import java.awt.EventQueue;

import java.awt.FontMetrics;

import java.awt.Graphics;

import java.awt.GridBagConstraints;

import java.awt.GridBagLayout;

import java.awt.Point;

import java.awt.Rectangle;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JLayeredPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.Timer;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

import javax.swing.border.LineBorder;

public class ScrollTest {

public static void main(String[] args) {

new ScrollTest();

}

private JScrollPane scrollPane;

private DesktopPane desktopPane;

public ScrollTest() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

ex.printStackTrace();

}

try {

desktopPane = new DesktopPane();

scrollPane = new JScrollPane(desktopPane);

JFrame frame = new JFrame("Testing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(scrollPane);

frame.setSize(desktopPane.getPreferredSize().width / 2, desktopPane.getPreferredSize().height / 2);

frame.setLocationRelativeTo(null);

frame.setVisible(true);

} catch (IOException exp) {

exp.printStackTrace();

}

}

});

}

public class DesktopPane extends JLayeredPane {

private List points;

public DesktopPane() throws IOException {

points = new ArrayList<>(25);

final BufferedImage img = ImageIO.read(new File("Desktop.jpg"));

final JLabel desktop = new JLabel(new ImageIcon(img));

final JPanel overlay = new JPanel() {

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

int xOff = desktop.getX();

int yOff = desktop.getY();

int count = 0;

FontMetrics fm = g.getFontMetrics();

int height = fm.getHeight();

for (Point p : points) {

g.setColor(Color.RED);

String text = Integer.toString(++count);

int width = fm.stringWidth(text);

int radius = Math.max(width, height) + 5;

int x = xOff + p.x - radius / 2;

int y = yOff + p.y - radius / 2;

g.fillOval(x, y, radius, radius);

g.setColor(Color.WHITE);

x += (radius - width) / 2;

y += ((radius - height) / 2) + fm.getAscent();

g.drawString(text, x, y);

}

}

};

overlay.setOpaque(false);

setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();

gbc.gridx = 0;

gbc.gridy = 0;

gbc.weightx = 1;

gbc.weighty = 1;

gbc.fill = GridBagConstraints.BOTH;

add(desktop, gbc);

add(overlay, gbc);

setLayer(desktop, 0);

setLayer(overlay, 5);

overlay.setBorder(new LineBorder(Color.RED));

Timer timer = new Timer(1000, new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

int x = (int) Math.round(Math.random() * img.getWidth());

int y = (int) Math.round(Math.random() * img.getHeight());

points.add(new Point(x, y));

repaint();

FontMetrics fm = getFontMetrics(overlay.getFont());

int height = fm.getHeight();

String text = Integer.toString(points.size() - 1);

int width = fm.stringWidth(text);

int radius = Math.max(width, height) + 5;

scrollRectToVisible(new Rectangle(x - radius / 2, y - radius / 2, radius, radius));

}

});

timer.start();

}

}

}

现在,如果要将点显示为尽可能靠近中心,则需要额外的工作……

现在,如果你真的想玩得开心,可以将延迟设置为50-100毫秒;)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经纬度 c代码中定义_如何将TXT文本格式的批量经纬度值导入到奥维成为标签

文本编辑&#xff1a;示例1&#xff1a;最基本的&#xff0c;只批量导入WGS-84经纬度值成为标签&#xff0c;不需要导入标签名称。 文本编辑格式&#xff1a;经度值空格纬度值换行&#xff0c;如下图&#xff1a;示例2&#xff1a;除WGS-84经纬度外&#xff0c;还要导入标签名称…

C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法

//控件代码 public partial class WebUserControl : System.Web.UI.UserControl { public void TestMethod(string strID) { this.TextBox1.Text " WebUserControl:" strID; //其他相关操作 } } //控件代码 public partial class WebU…

中国式创新技术“步态识别”终于来临,你大胆地走两步,我就知道你是谁

放完假的数据君&#xff0c;回到办公室&#xff0c;苦恼该码一篇什么文章&#xff0c;来给各位送上“节后的祝福”。 这么想着&#xff0c;数据君便开始浏览最新的科技报道&#xff1a; 什么鬼&#xff01;这难道是什么新兴的黑科技吗&#xff1f;&#xff01; 数据君赶紧查了…

帆软获取上月的第一天与最后一天_《原神》岩港打工第一天怎么玩 岩港打工第一天玩法攻略...

《原神》在11月2日开启了岩港奇珍行记&#xff0c;玩家可以在璃月港进行打工了&#xff0c;可能有的小伙伴还不清楚第一天的打工要怎么做&#xff0c;所以小编这次就为大家带来了《原神》岩港打工第一天玩法攻略&#xff0c;感兴趣的小伙伴可以来看一下。岩港打工第一天玩法攻略…

AgileConfig - RESTful API 介绍

AgileConfigAgileConfig是一个基于.net core开发的轻量级配置中心。AgileConfig秉承轻量化的特点&#xff0c;部署简单、配置简单、使用简单、学习简单&#xff0c;它只提取了必要的一些功能&#xff0c;并没有像Apollo那样复杂且庞大。但是它的功能也已经足够你替换webconfig&…

mysql卸载时弹框,win10卸载mysql5安装mysql8

使用mysql5的过程中使用 datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP 无法执行&#xff0c;原因是版本问题&#xff0c;因此我需要安装更高级的版本。一、卸载原有的mysql1、在控制面板中卸载mysql2、运行“regedit”文件&#xff0c;删除HKEY_LOCAL_MACHINE\SYSTEM\Co…

感谢Adobe,用上了Silverlight RC0版本

Adobe 23号发布CS4系列&#xff0c;24号网络上出现下载&#xff0c; MicorSoft 25号发布Silverlight RC0&#xff0c;26号网络上出现下载。 用上了Silverlight RC0&#xff0c; 真的要感谢Adobe&#xff0c;推出全新体验的Adobe Flash CS4正式版&#xff0c;也是Flash 10&#…

css中的单位换算_金蝶ERP入门教程:动态换算率及辅助计量单位的应用

金蝶ERP入门教程&#xff1a;动态换算率及辅助计量单位的应用关注我&#xff0c;我将定期分享更多的ERP解决方案如果您喜欢且觉得内容有用&#xff0c;请点击分享转发如果你有什么关于ERP系统的问题和疑问&#xff0c;可私信联系我大家好&#xff0c;我是Eric顾问哥&#xff1a…

因为加班,谈了7年的女友跟我分手了……

记得有一句很流行的话&#xff1a; 世界那么大&#xff0c;我想去看看 此时的你&#xff0c;走到了哪里&#xff1f; 还是停留在这里吗&#xff1f; 世界很小&#xff0c;小到仅有这几尺办公桌 工作很多&#xff0c;多到生活只余下工作 最近&#xff0c;腾讯上线了一支视频广告…

cf鼠标宏数据大全_游戏鼠标中的跑车,贱驴125M游戏鼠标体验!

如今全民玩游戏的年代&#xff0c;每个年轻人对自己玩游戏的装备也越来越看重。也越来越喜欢在这方面花钱&#xff0c;因为高手过招输赢本就在毫厘之间&#xff0c;如果能够拥有一款性能更强&#xff0c;使用更顺手的游戏装备&#xff0c;在玩游戏竞赛中&#xff0c;无疑有多了…

如何使用 Entity Framework 的 DbContext

微软的 Entity Framework 是一个开源的 对象-关系映射 ORM 框架&#xff0c;它帮助我们打通了 数据库的数据模型 到 代码层的领域模型&#xff0c;Entity Framework 简化了应用程序对数据库的 CURD 操作&#xff0c;而且还向高层屏蔽了数据是如何持久化到数据库的。说的具体一点…

php绘制饼图,php怎么绘制饼图?

php怎么绘制饼图&#xff1f;在php中&#xff0c;可以使用GD绘制饼图。GD库是php处理图形的扩展库&#xff0c;GD库提供了一系列用来处理图片的API&#xff0c;使用GD库可以处理图片&#xff0c;或者生成图片&#xff0c;也可以给图片加水印。PHP中用GD绘制饼图&#xff0c;绘制…

silklabo哪个公众号有资源_微小说免费渣渣团资源公众号看大全集

“免费小说全本”公众号。小说免费阅读吧|免费小说在线阅读网|免费小说资源|小说传送站&#xff5c;小说免费公众号推荐&#xff5c;免费小说全集书城推荐&#xff5c;免费小说公众号渣渣团&#xff5c;小说免费阅读叶辰萧初然|霸道总裁&#xff5c;先生是谁等全免费&#xff5…

Oracle 10R2 研究--db_file_multiblock_read_count对成本的影响

当研究oracle的查找方式中发现&#xff0c;在全表扫描和索引扫描时&#xff0c;会用到db_file_multiblock_read_count来一次读取多个IO。也看了一些关于db_file_multiblock_read_count的文章&#xff0c;为加深自己的理解&#xff0c;特做个试验研究。 以下是reference对它的解…

python视频实战_reboot第五期Python实战班视频_IT教程网

资源名称&#xff1a;reboot第五期Python实战班视频教程内容&#xff1a;第一章内容Hello Python上手简单脚本游戏 图形 WEB 你能想到的方方面面PYTHON都可以实现github上python的项目也足够多运行速度不是瓶颈课程实战目标python的基础,掌握基本的编程思想,具体的任务ACCESS_L…

大数据分析苏轼,你没看错,这些都是小学生完成的

适逢苏轼先生诞辰980周年&#xff0c;清华附小开展了一系列致敬苏轼的活动。同学们利用假期时间共完成课题研究报告23份&#xff1a;《大数据帮你进一步认识苏轼》、《苏轼的朋友圈》、《苏轼的旅游品牌价值分析》、《苏轼vs李白》等。是的&#xff0c;你没看错&#xff0c;这些…

深度解读.NET 5授权中间件的执行策略

前文提要2021.1月份我写了一个《这难道不是.NET5 的bug? 在线求锤&#xff1f;》&#xff0c;讲述了我在实现[全局授权访问特例匿名访问] 遇到的技术困惑: [特例匿名访问&#xff0c;怎么走了认证流程&#xff1f;]。博客园上某大佬的看法&#xff1a;大概的意思是说 &…

php myadmin怎么用,关于apachemysqlphpmyadmin的安装与配置

版本&#xff1a;apache_2.2.6-win32-x86-no_sslmysql-essential-5.0.45-win32php-5.2.5-Win32phpMyAdmin-2.11.3-all-languages版本不一样&#xff0c;配置多少会有些差异&#xff0c;但不会很大&#xff0c;大同小异罢了&#xff0c;但尽量还是要从官方网站上下载&#xff0c…

噪声与振动控制工程手册_仨亿技术丨工程机械噪声与控制分析

随着我国经济的发展&#xff0c;各种工程规模不断扩大、数量不断增多&#xff0c;这些工程在造福于人们并促进我国综合国力提高的同时&#xff0c;也在一定程度上带来一些工程机械噪声的问题。工程机械噪声的存在&#xff0c;不仅给工程机械的使用寿命带来不利影响&#xff0c;…

钱德沛教授:云计算和网格计算差别何在?

2008年10月16日&#xff0c;中国电子学会专家论坛——云计算研讨会在北京召开。国家“十五”863计划“计算机软硬件技术” 主题专家组副组长、北京航空航天大学钱德沛教授在会上介绍了自己关于云计算的看法&#xff0c;并分析了云计算与网格计算、Web计算等的差异&#xff0c;并…