java 获取组件大小_java - 如何初始化取决于组件大小的图像抓取? - 堆栈内存溢出...
如果我正确理解问题,那么您的方法会有些落后。 与其让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 - 如何初始化取决于组件大小的图像抓取? - 堆栈内存溢出...相关推荐
- java随机产生若干个偶数完成求和_java - 创建随机生成器以生成并计算奇数对偶数 - 堆栈内存溢出...
我真的非常困惑. 我已经进行过几次网络搜索,但找不到任何可以帮助我解决这一精确作业问题的信息. 涉及:Java,while循环,随机生成数字和扫描仪控制台输入. 我们必须完成main方法中的代码,以便 ...
- java爬虫防屏蔽_Java爬虫技术之绕过百度云防护抓取网站内容
如图: 首先需要一个Http工具类:HttpHandle package org.coody.robot.util; import java.io.ByteArrayOutputStream; imp ...
- java url 双引号_java - Java在POST请求中发送带有转义双引号的JSON字符串[duplicate] - 堆栈内存溢出...
我正在创建一个JSONObject并将JSON字符串发送到POST请求正文中的服务器. public String toJson() { JSONObject filter = new JSONObj ...
- java clob内存溢出_java - java.sql.SQLException:ORA-01704:字符串文字太长时插入或更新 - 堆栈内存溢出...
通常,当我插入4000个字符限制时,它的工作正常,但当超过4000个字符时,它抛出SQL异常字符串文字太长,即使我的DISCHARGE_TEXT数据类型是CLOB 我的JavaScript代码是 fu ...
- java 单元测试 异步_java - 如何使用CountdownLatch对异步代码进行单元测试同步 - 堆栈内存溢出...
我通过代码修改了公开我使用包保护函数注册的回调,如下所示: public void SomeClass { private final CountDownLatch latch = new Count ...
- ajax获取nodejs的值,jquery - NodeJS如何获取服务器中的数据,通过POST从jquery ajax调用发送 - 堆栈内存溢出...
我的客户正在进行ajax调用 {{ function callNode(){ console.log("I am called"); var data = {"email ...
- itext html 转换pdf后 字体加粗,java - 如何使用ITEXTRenderer将HTML转换为PDF时设置新的不同字体 - 堆栈内存溢出...
我正在尝试将HTML转换为PDF. 在HTML中,有些符号未显示在PDF文档中. 在调试时,我发现‑或‑字符在IText库中可用的任何默认字体中均不可用. 我的H ...
- java安装 错误1704_java - 从Eclipse内部启动Tomcat Mongrel插件时发生致命错误 - 堆栈内存溢出...
我正在尝试使用Mongrel插件从eclipse中启动Tomcat. Mongrel插件在Eclipse主窗口上添加了开始/停止/重新启动按钮. 当我单击开始按钮时,出现此错误. 我在机器上有多个jd ...
- java abort_java - HttpGet.abort()/ HttpPost.abort()并不总是立即中止 - 堆栈内存溢出...
我正在使用Apache HttpComponents 4.2.1而我无法让HttpGet.abort()和HttpPost.abort()立即中止. 它大部分时间都可以工作,但偶尔连接会阻塞,直到超时 ...
最新文章
- 了解下Lua 环境安装
- [C/C++标准库]_[初级]_[优先队列priority_queue的使用]
- Dynatrace DPM数字性能管理方案确保安吉星领跑车联网技术
- 2018技术卓越奖发布 阿里云数据库POLARDB获最佳创新产品奖
- 计算机无法屏幕亮度,电脑屏幕亮度无法调节怎么办
- react的详细知识讲解!
- PHP中error_reporting()详解
- oracle11 不更新记录,oracle11g 使用first_value获取表中不连接的ID号及掉失记录数量...
- oracle中pga指什么,oracle学习SGA跟PGA理解
- Storm消费Kafka异常 - topic其中两个分区达到某个值不进行消费,持续阻塞
- Java-instanceof和类型转换
- android webapi 返回html 代码,ANDROID调用VS2013 ASP.NET WEBAPI 返回DATATABLE 注意
- 安装dollar toolbox
- 微信加入新功能,60秒语音不必从头听到尾,网友:还需要进度条
- 【Flink】Flink 消费 kafka报错 写入 es 死信队列 FetchSessionHandler DisconnectException
- java继承涉及的动/静态绑定及隐藏
- Android开发中自定义表情并发送出去之经典的发送表情
- java-阴历日期和阳历日期互相转换
- 2015.4.28 今天开博客了
- Go语言自学系列 | golang标准库bufio
热门文章
- ANSI C: union
- ANSI C:+++
- java 固定值_这些频繁调用函数是否可以在dblquad中返回固定值?
- python3.5安装教程linux_Linux下安装python3.6和第三方库的教程详解
- python找思路_python 爬取贝壳的一些思路和方法设计(用地址找到小区名字)
- linux运维解决ddos,运维人员该如何排查并解决DDOS攻击
- 英雄无敌6服务器在哪个文件夹,Win7系统无法运行英雄无敌6的两种原因和解决方法...
- mvc 前段定义变量_3分钟短文 | Laravel blade模板里优雅地定义PHP变量
- OpenShift 4 Tekton (3) - 通过控制台的图形化方式配置Tekton Pipeline
- 使用SharpKit构建客户端Grid控件