如果我正确理解问题,那么您的方法会有些落后。 与其让ImageNavigator告诉ZoomedImage绘制哪个子图像,不如让ZoomedImage在绘制时询问ImageNavigator(通过重写ZoomedImage的paintComponent方法)。 当ZonedImage进行绘画时,它将完全摆在屏幕上,并且知道其大小,因此不会有问题。

另外,让ZoomedImage维护整个图像和显示区域的坐标,以便它将具有绘制自身所需的完整信息。 当用户与ImageNavigator交互时,它可以调用ZoomedImage来设置显示区域的坐标。

为了更加具体,这是第二种方法的一个小例子。 为简便起见,我没有创建“ ZoomedImage”类,而是使用了包含图像JLabel的JScrollPane,但它确实可以完成工作。 右侧是ImageNavigator,它调用“ ZoomedImage组件”(实际上是滚动窗格的视口)以获取并设置显示区域的坐标。 它绘制一个红色矩形突出显示该部分。 您可以使用滚动条,导航器或调整窗口大小来调整显示的区域。 没什么太复杂了,但希望它包含一些有用的见解:

import java.awt.*;

import javax.swing.*;

import javax.swing.event.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

class ImageNavigatorExample {

public static void main(String[] args) throws Throwable {

File imageFile = new File( // change file to one you have!

"Shallow Waters in the South Pacific.jpg");

BufferedImage image = javax.imageio.ImageIO.read(imageFile);

JFrame frame = new JFrame();

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JScrollPane imageScroller = new JScrollPane(new JLabel(new ImageIcon(image)));

imageScroller.setPreferredSize(new Dimension(640, 480));

frame.add(imageScroller);

frame.add(new ImageNavigator(image, imageScroller.getViewport()), BorderLayout.EAST);

frame.pack();

frame.setVisible(true);

}

private static class ImageNavigator extends JPanel {

private final BufferedImage image;

private final JViewport viewport;

public ImageNavigator(BufferedImage image, final JViewport viewport) {

this.image = image;

this.viewport = viewport;

viewport.addChangeListener(new ChangeListener() {

@Override

public void stateChanged(ChangeEvent e) {

repaint();

}

});

MouseAdapter mouseAdapter = new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

int xImage = Math.round(e.getX() / scale());

int yImage = Math.round(e.getY() / scale());

viewport.setViewPosition(new Point(

Math.max(0, xImage - viewport.getExtentSize().width / 2),

Math.max(0, yImage - viewport.getExtentSize().height / 2)));

}

@Override

public void mouseDragged(MouseEvent e) {

mousePressed(e);

}

};

this.addMouseListener(mouseAdapter);

this.addMouseMotionListener(mouseAdapter);

}

@Override

public Dimension getPreferredSize() {

return new Dimension(150, image.getWidth() * 150 / image.getHeight());

}

private float scale() {

return (float)this.getWidth() / image.getWidth();

}

@Override

public void paintComponent(Graphics g1) {

super.paintComponent(g1);

Graphics2D g = (Graphics2D)g1.create();

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

g.scale(scale(), scale());

g.drawImage(image, 0, 0, null);

g.setColor(Color.red);

g.setStroke(new BasicStroke(scale()));

g.draw(viewport.getViewRect());

}

}

}

看起来像什么:

java 获取组件大小_java - 如何初始化取决于组件大小的图像抓取? - 堆栈内存溢出...相关推荐

  1. java随机产生若干个偶数完成求和_java - 创建随机生成器以生成并计算奇数对偶数 - 堆栈内存溢出...

    我真的非常困惑. 我已经进行过几次网络搜索,但找不到任何可以帮助我解决这一精确作业问题的信息. 涉及:Java,while循环,随机生成数字和扫描仪控制台输入. 我们必须完成main方法中的代码,以便 ...

  2. java爬虫防屏蔽_Java爬虫技术之绕过百度云防护抓取网站内容

    如图: 首先需要一个Http工具类:HttpHandle package org.coody.robot.util; import java.io.ByteArrayOutputStream; imp ...

  3. java url 双引号_java - Java在POST请求中发送带有转义双引号的JSON字符串[duplicate] - 堆栈内存溢出...

    我正在创建一个JSONObject并将JSON字符串发送到POST请求正文中的服务器. public String toJson() { JSONObject filter = new JSONObj ...

  4. java clob内存溢出_java - java.sql.SQLException:ORA-01704:字符串文字太长时插入或更新 - 堆栈内存溢出...

    通常,当我插入4000个字符限制时,它的工作正常,但当超过4000个字符时,它抛出SQL异常字符串文字太长,即使我的DISCHARGE_TEXT数据类型是CLOB 我的JavaScript代码是 fu ...

  5. java 单元测试 异步_java - 如何使用CountdownLatch对异步代码进行单元测试同步 - 堆栈内存溢出...

    我通过代码修改了公开我使用包保护函数注册的回调,如下所示: public void SomeClass { private final CountDownLatch latch = new Count ...

  6. ajax获取nodejs的值,jquery - NodeJS如何获取服务器中的数据,通过POST从jquery ajax调用发送 - 堆栈内存溢出...

    我的客户正在进行ajax调用 {{ function callNode(){ console.log("I am called"); var data = {"email ...

  7. itext html 转换pdf后 字体加粗,java - 如何使用ITEXTRenderer将HTML转换为PDF时设置新的不同字体 - 堆栈内存溢出...

    我正在尝试将HTML转换为PDF. 在HTML中,有些符号未显示在PDF文档中. 在调试时,我发现&#8209或&#x2011字符在IText库中可用的任何默认字体中均不可用. 我的H ...

  8. java安装 错误1704_java - 从Eclipse内部启动Tomcat Mongrel插件时发生致命错误 - 堆栈内存溢出...

    我正在尝试使用Mongrel插件从eclipse中启动Tomcat. Mongrel插件在Eclipse主窗口上添加了开始/停止/重新启动按钮. 当我单击开始按钮时,出现此错误. 我在机器上有多个jd ...

  9. java abort_java - HttpGet.abort()/ HttpPost.abort()并不总是立即中止 - 堆栈内存溢出...

    我正在使用Apache HttpComponents 4.2.1而我无法让HttpGet.abort()和HttpPost.abort()立即中止. 它大部分时间都可以工作,但偶尔连接会阻塞,直到超时 ...

最新文章

  1. 了解下Lua 环境安装
  2. [C/C++标准库]_[初级]_[优先队列priority_queue的使用]
  3. Dynatrace DPM数字性能管理方案确保安吉星领跑车联网技术
  4. 2018技术卓越奖发布 阿里云数据库POLARDB获最佳创新产品奖
  5. 计算机无法屏幕亮度,电脑屏幕亮度无法调节怎么办
  6. react的详细知识讲解!
  7. PHP中error_reporting()详解
  8. oracle11 不更新记录,oracle11g 使用first_value获取表中不连接的ID号及掉失记录数量...
  9. oracle中pga指什么,oracle学习SGA跟PGA理解
  10. Storm消费Kafka异常 - topic其中两个分区达到某个值不进行消费,持续阻塞
  11. Java-instanceof和类型转换
  12. android webapi 返回html 代码,ANDROID调用VS2013 ASP.NET WEBAPI 返回DATATABLE 注意
  13. 安装dollar toolbox
  14. 微信加入新功能,60秒语音不必从头听到尾,网友:还需要进度条
  15. 【Flink】Flink 消费 kafka报错 写入 es 死信队列 FetchSessionHandler DisconnectException
  16. java继承涉及的动/静态绑定及隐藏
  17. Android开发中自定义表情并发送出去之经典的发送表情
  18. java-阴历日期和阳历日期互相转换
  19. 2015.4.28 今天开博客了
  20. Go语言自学系列 | golang标准库bufio

热门文章

  1. ANSI C: union
  2. ANSI C:+++
  3. java 固定值_这些频繁调用函数是否可以在dblquad中返回固定值?
  4. python3.5安装教程linux_Linux下安装python3.6和第三方库的教程详解
  5. python找思路_python 爬取贝壳的一些思路和方法设计(用地址找到小区名字)
  6. linux运维解决ddos,运维人员该如何排查并解决DDOS攻击
  7. 英雄无敌6服务器在哪个文件夹,Win7系统无法运行英雄无敌6的两种原因和解决方法...
  8. mvc 前段定义变量_3分钟短文 | Laravel blade模板里优雅地定义PHP变量
  9. OpenShift 4 Tekton (3) - 通过控制台的图形化方式配置Tekton Pipeline
  10. 使用SharpKit构建客户端Grid控件