Java 摆动-避免在不同管路之间填充管路
我试图通过用Java开发一个简单的绘图应用程序进入Swing 问题是我正在使用一组Java 摆动-避免在不同管路之间填充管路,java,swing,graphics,line,mouselistener,Java,Swing,Graphics,Line,Mouselistener,我试图通过用Java开发一个简单的绘图应用程序进入Swing 问题是我正在使用一组点来跟踪mouseDragged事件,但是当我释放鼠标按钮并开始绘制一条新线时,它们会连接起来(上一条线的最后一个节点到新线的第一个点) 我在想,也许可以跟踪另一个ArrayList中的鼠标按下的和鼠标松开的监听器听到的点,知道每一行的起点和终点,然后,在点之间画线的时候,检查它们是否在ArrayList中,并避免绘制该行 你建议的方法是什么?如何在代码中实现这一点?谢谢大家! package ccdraw; i
点来跟踪mouseDragged
事件,但是当我释放鼠标按钮并开始绘制一条新线时,它们会连接起来(上一条线的最后一个节点到新线的第一个点)
我在想,也许可以跟踪另一个ArrayList
中的鼠标按下的和鼠标松开的监听器听到的点
,知道每一行的起点和终点,然后,在点之间画线的时候,检查它们是否在ArrayList
中,并避免绘制该行
你建议的方法是什么?如何在代码中实现这一点?谢谢大家!
package ccdraw;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.event.MouseInputListener;
@SuppressWarnings("serial")
public class DrawingArea extends JPanel implements MouseInputListener {
private ArrayList<Point> pointList = new ArrayList<Point>();
//private ArrayList<Point> beginEndPoints = new ArrayList<Point>();
public DrawingArea() {
super();
super.setPreferredSize(new Dimension(400,400));
setBorder(BorderFactory.createLineBorder(Color.black));
addMouseListener(this);
addMouseMotionListener(this);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
doDrawing(g);
}
private void doDrawing(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(1.5f));
for (int i=1;i<pointList.size()-1;i++){
// here i should check when it changes between old and new line
// and don't draw the line between those two points!
//if(pointList.get(i).x - pointList.get(i+1).x <= 1 && pointList.get(i).y - pointList.get(i+1).y <= 1)
g2d.drawLine(pointList.get(i).x, pointList.get(i).y, pointList.get(i+1).x, pointList.get(i+1).y);
}
}
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
pointList.add(arg0.getPoint());
}
@Override
public void mouseReleased( MouseEvent arg0) {
pointList.add(arg0.getPoint());
repaint();
}
@Override
public void mouseDragged(MouseEvent arg0) {
pointList.add(arg0.getPoint());
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
}
包ccdraw;
导入java.awt.BasicStroke;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.event.MouseEvent;
导入java.util.ArrayList;
导入javax.swing.BorderFactory;
导入javax.swing.JPanel;
导入javax.swing.event.MouseInputListener;
@抑制警告(“串行”)
公共类DrawingArea扩展JPanel实现MouseInputListener{
private ArrayList pointList=new ArrayList();
//私有ArrayList beginEndPoints=新ArrayList();
公共提款区(){
超级();
super.setPreferredSize(新尺寸(400400));
setboorder(BorderFactory.createLineBorder(Color.black));
addMouseListener(这个);
addMouseMotionListener(此);
}
公共组件(图形g){
超级组件(g);
doDrawing(g);
}
私人空间绘制(图g){
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(Color.RED);
g2d.设定行程(新基本行程(1.5f));
对于(int i=1;i
我在想,也许可以在另一个arraylist中记录鼠标按下和鼠标按下的听众所听到的要点
保存一个ArrayList的ArrayList
因此,每次执行mousePressed操作时,都会为MouseDraged事件要添加的一系列点启动一个新的ArrayList
然后在绘制代码中迭代两个ArrayList。这应该比为起点/终点添加异常逻辑更容易
另一种选择是直接对BuffereImage进行绘制,因此您根本不需要跟踪点。请查看这两种常规自定义绘制方法的比较,以确定哪种方法最适合您的要求。使用ArrayList是我的选择,我创建了另一个Line类,该类使用ArrayList。