Java设置pdf细线_java – 拖动光标时如何绘制没有间隙的细线?

在Java编程中,创建PDF并绘制细线时遇到了线条断裂的问题,尤其在鼠标快速移动时。该问题源于画线的刷新频率与鼠标移动速度不匹配。解决方案在于优化画线逻辑,确保线条在快速移动鼠标时也能连续显示。可以调整画线的刷新策略,例如增加缓冲区或者使用更精确的画线算法来改善线条连贯性。
摘要由CSDN通过智能技术生成

搜索热词

我有以下类,它在第0层刷新jpeg文件,第1层用于绘制/绘制/草绘与粉碎事物相关的任何内容.但是在我的绘画中,当我想做一条细线时,它就会断裂.因为鼠标光标移动需要较慢.

如何解决快速鼠标移动,线路仍然连接?

Annotation.java

package test;

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class Annotation {

// Image

private static Image backgroundImage;

private static BufferedImage _bufImage = null;

// Enum

public static enum Shape { RECTANGLE,OVAL,LINE }

private static enum State { IDLE,DRAGGING }

private static final Shape INIIIAL_SHAPE = Shape.RECTANGLE;

private static final Color INITIAL_COLOR = Color.RED;

private static Shape _shape = INIIIAL_SHAPE;

private static Color _color = INITIAL_COLOR;

private static State _state = State.IDLE;

private static Point _start = null;

private static Point _end = null;

// JPanel

private static JPanel p;

private static JPanel mp;

/* Run: */

public static void main(String args[]) {

c();

}

/* GUI */

public static void c() {

try {

backgroundImage = ImageIO.read(new File("/var/tmp/test.jpeg"));

} catch (IOException e) {

e.printStackTrace();

}

myTimer();

loadAnnotation();

loadBackground();

JFrame f;

f = new JFrame();

f.setLayout(new BorderLayout());

f.add(mp);

f.pack();

f.setVisible(true);

}

/* 5 seconds to load picture */

public static void myTimer() {

javax.swing.Timer t = new javax.swing.Timer(5000,new ActionListener() {

public void actionPerformed(ActionEvent ae) {

try {

backgroundImage = ImageIO.read(new File("/var/tmp/test.jpeg"));

mp.repaint();

} catch (IOException e) {

e.printStackTrace();

}

}

});

t.start();

}

/* Layer 0:

* Load background picture */

public static void loadBackground() {

mp = new JPanel() {

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawImage(backgroundImage,1024,600,null);

}

public Dimension getPreferredSize() {

return new Dimension(1024,600);

}

};

mp.add(p);

}

/* Layer 1:

* Annotation: Draw on top of background picture anything! */

public static void loadAnnotation() {

p = new JPanel() {

public void paintComponent(Graphics g) {

Graphics2D g2 = (Graphics2D)g;

g2.setColor(Color.RED);

if (_bufImage == null) {

int w = this.getWidth();

int h = this.getHeight();

_bufImage = new BufferedImage(1024,BufferedImage.TRANSLUCENT);

Graphics2D gc = _bufImage.createGraphics();

}

g2.drawImage(_bufImage,null,0);

if (_state == State.DRAGGING) {

g2.drawLine(_start.x,_start.y,_end.x,_end.y);

}

}

public Dimension getPreferredSize() {

return new Dimension(1024,600);

}

};

p.setLayout(new FlowLayout());

p.addMouseListener(new MouseListener() {

@Override

public void mouseClicked(MouseEvent me) {

}

@Override

public void mousePressed(MouseEvent me) {

}

@Override

public void mouseReleased(MouseEvent me) {

//_state = State.IDLE;

_state = State.IDLE;

}

@Override

public void mouseEntered(MouseEvent me) {

}

@Override

public void mouseExited(MouseEvent me) {

}

});

p.addMouseMotionListener(new MouseMotionListener() {

@Override

public void mouseDragged(MouseEvent me) {

System.out.println("drag");

_state = State.DRAGGING;

_start = me.getPoint();

_end = _start;

if (_state == State.DRAGGING) {

Graphics2D g2 = _bufImage.createGraphics();

g2.setColor(Color.red);

g2.setStroke(new BasicStroke(90));

g2.fillOval(_start.x,10,10);

p.repaint();

}

}

@Override

public void mouseMoved(MouseEvent me) {

System.out.println("move");

}

});

JButton pm = new JButton("+");

pm.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

}

});

p.add(pm);

p.setOpaque(true);

}

}

最佳答案

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;

import java.net.URL;

import javax.imageio.ImageIO;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class Annotation {

// Image

private static Image backgroundImage;

private static BufferedImage _bufImage = null;

// Enum

public static enum Shape { RECTANGLE,DRAGGING }

private static final Shape INIIIAL_SHAPE = Shape.RECTANGLE;

private static final Color INITIAL_COLOR = Color.RED;

private static Shape _shape = INIIIAL_SHAPE;

private static Color _color = INITIAL_COLOR;

private static State _state = State.IDLE;

private static Point _start = null;

private static Point _end = null;

// JPanel

private static JPanel p;

private static JPanel mp;

/* Run: */

public static void main(String args[]) {

c();

}

/* GUI */

public static void c() {

try {

URL url = new URL("http://pscode.org/media/stromlo2.jpg");

backgroundImage = ImageIO.read(url);

} catch (Exception e) {

e.printStackTrace();

}

loadAnnotation();

loadBackground();

JFrame f;

f = new JFrame();

f.setLayout(new BorderLayout());

f.add(mp);

f.pack();

f.setVisible(true);

}

/* Layer 0:

* Load background picture */

public static void loadBackground() {

mp = new JPanel() {

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawImage(backgroundImage,getWidth(),getHeight(),null);

}

public Dimension getPreferredSize() {

return new Dimension(backgroundImage.getWidth(this),backgroundImage.getHeight(this));

}

};

mp.add(p);

}

/* Layer 1:

* Annotation: Draw on top of background picture anything! */

public static void loadAnnotation() {

p = new JPanel() {

public void paintComponent(Graphics g) {

Graphics2D g2 = (Graphics2D)g;

g2.setColor(Color.RED);

if (_bufImage == null) {

int w = this.getWidth();

int h = this.getHeight();

_bufImage = new BufferedImage(1024,0);

if (_state == State.DRAGGING) {

g2.drawLine(_start.x,_end.y);

}

}

public Dimension getPreferredSize() {

return new Dimension(1024,600);

}

};

p.setLayout(new FlowLayout());

p.addMouseListener(new MouseListener() {

@Override

public void mouseClicked(MouseEvent me) {

}

@Override

public void mousePressed(MouseEvent me) {

}

@Override

public void mouseReleased(MouseEvent me) {

//_state = State.IDLE;

_state = State.IDLE;

}

@Override

public void mouseEntered(MouseEvent me) {

}

@Override

public void mouseExited(MouseEvent me) {

}

});

p.addMouseMotionListener(new MouseMotionListener() {

@Override

public void mouseDragged(MouseEvent me) {

_state = State.DRAGGING;

_end = me.getPoint();

if (_state == State.DRAGGING) {

Graphics2D g2 = _bufImage.createGraphics();

g2.setColor(Color.red);

g2.setStroke(new BasicStroke(2));

g2.drawLine(_start.x,_end.y);

p.repaint();

}

_start = _end;

}

@Override

public void mouseMoved(MouseEvent me) {

//System.out.println("move");

_start = me.getPoint();

}

});

JButton pm = new JButton("+");

pm.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

}

});

p.add(pm);

p.setOpaque(true);

}

}

相关文章

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值