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

从那里,它只是使用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毫秒;)

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

  1. java中画幅相机推荐_比全画幅更大 平民中画幅相机推荐

    比全画幅更大 平民中画幅相机推荐 2018-09-16 09:00:05 111点赞 184收藏 91评论 随着无反/微单相机的大行其道.技术越发成熟,以及手机拍照功能愈发强大,越来越多的相机厂商调整 ...

  2. Java实现 LeetCode 503 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  3. Java实现 LeetCode 556 下一个更大元素 III(数组的翻转)

    556. 下一个更大元素 III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 1 ...

  4. Java实现 LeetCode 496 下一个更大元素 I

    496. 下一个更大元素 I 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nu ...

  5. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  6. 外媒:新iPhone系列配备更大无线充电线圈 反向无线充即将到来

    7月5日消息,据国外媒体报道,新的iPhone系列可能配备更大无线充电线圈,既有助于无线充电散热和提升功率,而且可能将为反向无线充做好准备. 此前有报道称,2021款iPhone将配备更强的MagSa ...

  7. java设置关闭计算机,java实现电脑定时关机的方法

    本文实例讲述了java如何注册成windows服务程序及一个简单的java定时关机程序代码,分享给大家供大家参考.具体方法如下: 一.问题: 最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可 ...

  8. html video 设置进度条不可拖动_PHP大文件切割上传并带上进度条功能,不妨一试...

    文章来自:脚本之家链接:https://www.jb51.net/article/164316.htm 作者:hhmp 商务合作:请加微信(QQ):2230304070 资源教程分享 码农网-技术教程 ...

  9. java和c语言哪个用途更大更广泛?

    java是面向对象的编程语言,而C是面向过程的编程语言.C语言和Java语言是目前被广泛使用的编程语言,C语言在物联网领域有广泛的应用,而Java语言则在Web开发.移动互联网开发.大数据开发.人工智 ...

最新文章

  1. 超棒的跨浏览器纯CSS动画实现 - Animate.css
  2. Sidebar 左右菜单的使用
  3. 摄像头(Ov965x)驱动分析
  4. OpenCV-Python 彩色图像均衡化与规定化
  5. 希望的背后……感谢青鸟、感谢51cto、感谢帮助过我的人们
  6. java 静态对象赋值_基于Java class对象说明、Java 静态变量声明和赋值说明(详解)...
  7. Mysql数据表的操作
  8. Portal: 强叔侃墙
  9. 初学WCF,一个简单的示例(增删改查,实体类)
  10. StylesheetLanguage--如何使用Less--前端样式语言
  11. android ios 下载地址,Ios/Android h5 唤起本地APP
  12. 小程序上传大小限制问题解决
  13. 一位SAP培训顾问的建议:SAP HANA应该如何学习?
  14. 百度面试题:求绝对值最小的数
  15. 高精度数字温度传感器为基于RTD和医疗应用的设计带来简便性
  16. 颠覆大数据分析之Storm的设计模式
  17. UICollectionView基本使用详解(OC)
  18. HTML网页表格标签,HTML静态网页(标签、表格)
  19. TM1650数码管驱动芯片
  20. 阿里云GPU云服务器gn5i/gn5/gn6i/gn6v详解

热门文章

  1. 我为什么选择Angular 2?
  2. php将数字转化为中文大写人民币格式
  3. 工程测量不用愁,120个视频动画帮你忙,简单易学直观明了!
  4. 遥感方法研究张掖市1999-2010年土地利用变化
  5. ArcGIS 10.2中栅格数据的属性表问题
  6. C语言试题七十一之请编写函数求出这个数的阶乘
  7. Android之解决YouTubePlayerView启动在Android5.0左右的手机出现奔溃问题
  8. LeetCode之Hamming Distance
  9. linux环境下最简单的C语言例子
  10. Linux怎么查询全部容器时间,linuxea:如何单单修改docker容器的系统时间