java 如何实现以鼠标为中心用滚轮对图片进行局部的放大

q13916379054 2016-08-11 04:20:55
我通过这段代码画了一张河流地图,现在的问题是如何实现以鼠标为中心用滚轮对这张地图进行局部的放大
package test2;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import javax.swing.JFrame;

public class test2_1 extends JFrame {
public static void main(String argv[]) {
test2_1 test = new test2_1();
test.createWin();
}

public void readlay(String fileName) {
File file = new File(fileName);
if (file.exists()) {
try {
InputStream in = new FileInputStream(file);
byte[] b = new byte[in.available()];
in.read(b);
in.close();

int m0 = bytes2Int(b, 0, 4, false);
System.out.println(m0);
String m1 = new String(b, 4, 6);
System.out.println(m1);
int m2 = bytes2Int(b, 516, 4, false);
System.out.println(m2);
int m3 = bytes2Int(b, 520, 4, false);
System.out.println(m3);
int m4 = bytes2Int(b, 524, 4, false);
System.out.println(m4);
int m5 = bytes2Int(b, 528, 4, false);
System.out.println(m5);
double m6 = bytes2Double(b, 532);
System.out.println(m6);
double m7 = bytes2Double(b, 540);
System.out.println(m7);
double m8 = bytes2Double(b, 548);
System.out.println(m8);
double m9 = bytes2Double(b, 556);
System.out.println(m9);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// close
}
}
}

public void readidx(String fileName) {
File file = new File(fileName);
int i = 0;
if (file.exists()) {
try {
InputStream in = new FileInputStream(file);
byte[] b = new byte[in.available()];
in.read(b);
in.close();
for (i = 0; i < 98; i++) {
int s = 72 * i;
int m0 = bytes2Int(b, 0 + s, 4, false);
System.out.print(m0 + ",");
int m1 = bytes2Int(b, 4 + s, 4, false);
System.out.print(m1 + ",");
int m2 = bytes2Int(b, 8 + s, 4, false);
System.out.print(m2 + ",");
int m3 = bytes2Int(b, 12 + s, 4, false);
System.out.print(m3 + ",");
int m4 = bytes2Int(b, 16 + s, 4, false);
System.out.print(m4 + ",");
int m5 = bytes2Int(b, 20 + s, 4, false);
System.out.print(m5 + ",");
double m6 = bytes2Double(b, 24 + s);
System.out.print(m6 + ",");
int m7 = bytes2Int(b, 32 + s, 4, false);
System.out.print(m7 + ",");
double m8 = bytes2Double(b, 36 + s);
System.out.print(m8 + ",");
double m9 = bytes2Double(b, 44 + s);
System.out.print(m9 + ",");
double m10 = bytes2Double(b, 52 + s);
System.out.print(m10 + ",");
double m11 = bytes2Double(b, 60 + s);
System.out.println(m11);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// close
}
}
}

public void readpts(String fileName,ArrayList<Integer> part) {
File file = new File(fileName);
int i,j = 0;
if (file.exists()) {
try {
InputStream in = new FileInputStream(file);
byte[] b = new byte[in.available()];
in.read(b);
in.close();
for (i = 0; i < b.length; i = i + 4) {
int m0 = bytes2Int(b, i, 4, false);
System.out.println(m0);
part.add(m0);
j++;
}
System.out.println(j);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// close
}
}
}

public void readcor(String fileName, ArrayList<Double> x, ArrayList<Double> y) {
File file = new File(fileName);
int j = 0;
if (file.exists()) {
try {
InputStream in = new FileInputStream(file);
byte[] b = new byte[in.available()];
in.read(b);
in.close();
for (int i = 0; i < b.length; i = i + 16) {

double m0 = bytes2Double(b, i);
double m1 = bytes2Double(b, i + 8);
// System.out.println(m0 +","+ m1);
x.add(m0);
y.add(m1);
j++;
}

System.out.println(j);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// close
}
}
}

public void readdbf(String fileName) {
File file = new File(fileName);
int i = 0;
if (file.exists()) {
try {
InputStream in = new FileInputStream(file);
byte[] b = new byte[in.available()];
in.read(b);
in.close();
int j = 0;
for (i = 0; i < 98; i++) {
j = i * 51;
String m0 = new String(b, 106 + j, 2);
String m1 = new String(b, 108 + j, 40);
m0 = m0.trim();
m1 = m1.trim();
System.out.println(m0 + "," + m1);
}
System.out.print(j);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// close
}
}
}
public static double bytes2Double(byte[] arr, int sta) {
long value = 0;
byte[] s = new byte[8];
for (int i = 0; i < 8; i++) {
s[i] = arr[i + sta];
}
for (int j = 0; j < 8; j++) {
value |= ((long) (s[j] & 0xff)) << (8 * j);
}
return Double.longBitsToDouble(value);
}

private static int bytes2Int(byte[] bys, int start, int len, boolean isBigEndian) {
int n = 0;
for (int i = start, k = start + len % (Integer.SIZE / Byte.SIZE + 1); i < k; i++) {
n |= (bys[i] & 0xff) << ((isBigEndian ? (k - i - 1) : i) * Byte.SIZE);
}
return n;
}

public void createWin() {
// 设置标题
this.setTitle("地图读取");
this.setBackground(Color.red);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置大小可更改
this.setResizable(false);
// 设置大小
this.setSize(1200, 600);
// 显示窗口
this.setVisible(true);
}
public void paint(Graphics g) {
super.paint(g);
int pnum=0;
ArrayList<Double> x = new ArrayList<Double>();
ArrayList<Double> y = new ArrayList<Double>();
ArrayList<Integer> part=new ArrayList<Integer>();

test2_1 test = new test2_1();
test.readlay("D:/golang/mygo_project/src/test2/rivers.lay");
test.readidx("D:/golang/mygo_project/src/test2/rivers.idx");
test.readpts("D:/golang/mygo_project/src/test2/rivers.pts",part);
test.readcor("D:/golang/mygo_project/src/test2/rivers.cor", x, y);
test.readdbf("D:/golang/mygo_project/src/test2/rivers.dbf");

double[] x1 = new double[x.size()];
double[] y1 = new double[y.size()];
int[] part1=new int[part.size()];
for (int i = 0; i < x.size(); i++) {
x1[i] = x.get(i);
}
for (int i = 0; i < y.size(); i++) {
y1[i] = y.get(i);
}
for (int i = 0; i < part.size(); i++) {
part1[i] = part.get(i);
}
System.out.println(x1.length+","+y1.length+","+part1.length);
Graphics2D g2d = (Graphics2D) g;
g2d.translate(getWidth() / 2, getHeight() / 2);
g2d.setColor(Color.blue);
for (int i = 0;i<part1.length;i++){
pnum=test.draw(x1, y1, g2d,part1[i],pnum);
}
}

public int draw(double x1[],double y1[],Graphics2D g2d,int s,int pnum){
System.out.print(pnum+","+(pnum+s-1));
int i=pnum+s-1;
for (; pnum < i; pnum++) {
// System.out.println(x1[i] + "," + y1[i]);
Line2D line = new Line2D.Double(x1[pnum]*3 ,-y1[pnum]*3 , x1[pnum+1]*3, -y1[pnum+1]*3 );// 创建line对象
g2d.draw(line);
}
pnum=pnum+1;
System.out.println(pnum);
return pnum;
}

}

...全文
504 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
q13916379054 2016-08-12
  • 打赏
  • 举报
回复
纯新手,从没接触过这些,花了一个礼拜才勉强画出这张图。。。。。。接下来的缩放什么的完全搞不懂
拘谨的小人 2016-08-12
  • 打赏
  • 举报
回复
这种活应该找个前端框架来 是不是会方便点
q13916379054 2016-08-12
  • 打赏
  • 举报
回复
有大神么,求指点啊
q13916379054 2016-08-12
  • 打赏
  • 举报
回复
感觉csdn不靠谱啊,问了4次问题没一次是解决了的,最后还是要靠自己啊
q13916379054 2016-08-12
  • 打赏
  • 举报
回复
我已经实现了上面的目的,现在我希望将河流的标注文字调整到非重叠且无歧义的位置
这是我的图

这是要求的图




应该怎么做
weixin_35722556 2016-08-11
  • 打赏
  • 举报
回复
坐等大牛。 能不能把画图定义成一个方法,监听滚笼 滑动事件, 重画一下。 当然这个方法可定要有放大比例的参数。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧