关于java图形处理的问题

时间:2023-02-05 11:13:35
问题:现在公司做一个流程定制的项目,而我现要实现一个applet来动态的画类似于流程图的图形,图形元素有六种,加上带箭头的连接线。就是说根据数据可以知道我需要画那些图形,每个节点之间的连接关系,还有当前流程所在节点,节点要高亮,点击某个节点,有个超链能连接到一个jsp页面,显示相关数据。
 当然如果是用Graphics画图是没问题的,但我要怎么接受鼠标点击时间呢。如果通过鼠标点击事件的点击坐标,如何来判断是和节点呢。
 如果是用drawImage来实现,似乎存在同样的问题,是不是可以接受鼠标事件,还有就是连线的端点怎么定位到图片上。
 各位大侠有什么妙计,请教教小弟,不胜感激。

12 个解决方案

#1


鼠标事件是发生在组建上,而不是发生在image上,所以用什么显示图形都无所谓,关键在于判断鼠标事件的xy坐标是发生在哪个图形元素上的,图形元素要是没有重叠,很简单,不同的图形有不同的坐标判断方法;如果有重叠,要考虑图形元素的z-order。
abstract class Figure
{
  public abstract void draw(Graphics g);
  public abstract void isPointIn(int x,int y); //点(x,y)是否在该图形元素内
  //....
}
class Circle extends Figure
{
  private int x0,y0,r;
  public void isPointIn(int x,int y)
  {
    if( (x-x0)*(x-x0)+(y-y0)*(y-y0)<=r*r ){
       return true;
    }else{
       return false; 
    }
  }
  //....
}

#2


用VML吧

#3


使用jgraph,用事件监听判断

#4


upup
prototype pattern

#5


GhostValley:我最初打算的是来判断鼠标的坐标位置的,但有一个问题请帮忙想想,我当时的想法是,当点击鼠标,在mousePressed方法中得到point,然后遍历各个节点,判断point是不是在节点内,但是,如果节点比较多的话,层次关系较复杂的话呢,怎么办

#6


不要采用遍历的方法,用四叉树分割空间来存储节点,可以达到log(4,n)的时间复杂度

#7


流程设计器我曾经写过,如果你光用graphic的mousePressed等事件来监听判断,到元素多了后就有点问题,就象在mfc的View中画图,如果全写在view中,你以后修改会很困难,因为复杂度会猛增,所以把画图工作分到你的图形对象中是一个较好的设计,这样做要求你要设计一个事件机制,让你的图形对象能得到鼠标事件。呵呵,java的好处在于,它没有mfc这样要求有固定的事件路径,你完全可以自己定义事件族及流向。
  当然你也可以向GhostValley说的用比较复杂的算法来做,这是以数据结构为中心的。而我的实践是以图形对象为中心的。
  呵呵,这年头,用java2d好想不多啊!

#8


up

#9


没什么问题。。。。简单着呢。。呵呵。

#10


用PropertyChangeListener和PropertyChangeEvent不用判断鼠标位置。表现节点的组件添加
addPropertyChangeListener(),接点不用画,用JLable就可以了。

#11


谢谢大家的帮忙,我现在打算用jgraph来做,今天看了其文档和一些实例,应该能实现我的要求,正在研究中,不过时间真的比较紧,那位兄弟用用过jgraph,能不能教教我,我的msn:ewei3000112@hotmail.com, QQ:305953921.

#12


请问哪位有用过jgraph吗,我现在需要在applet上画一个圆形节点,谁能教教我吗

#1


鼠标事件是发生在组建上,而不是发生在image上,所以用什么显示图形都无所谓,关键在于判断鼠标事件的xy坐标是发生在哪个图形元素上的,图形元素要是没有重叠,很简单,不同的图形有不同的坐标判断方法;如果有重叠,要考虑图形元素的z-order。
abstract class Figure
{
  public abstract void draw(Graphics g);
  public abstract void isPointIn(int x,int y); //点(x,y)是否在该图形元素内
  //....
}
class Circle extends Figure
{
  private int x0,y0,r;
  public void isPointIn(int x,int y)
  {
    if( (x-x0)*(x-x0)+(y-y0)*(y-y0)<=r*r ){
       return true;
    }else{
       return false; 
    }
  }
  //....
}

#2


用VML吧

#3


使用jgraph,用事件监听判断

#4


upup
prototype pattern

#5


GhostValley:我最初打算的是来判断鼠标的坐标位置的,但有一个问题请帮忙想想,我当时的想法是,当点击鼠标,在mousePressed方法中得到point,然后遍历各个节点,判断point是不是在节点内,但是,如果节点比较多的话,层次关系较复杂的话呢,怎么办

#6


不要采用遍历的方法,用四叉树分割空间来存储节点,可以达到log(4,n)的时间复杂度

#7


流程设计器我曾经写过,如果你光用graphic的mousePressed等事件来监听判断,到元素多了后就有点问题,就象在mfc的View中画图,如果全写在view中,你以后修改会很困难,因为复杂度会猛增,所以把画图工作分到你的图形对象中是一个较好的设计,这样做要求你要设计一个事件机制,让你的图形对象能得到鼠标事件。呵呵,java的好处在于,它没有mfc这样要求有固定的事件路径,你完全可以自己定义事件族及流向。
  当然你也可以向GhostValley说的用比较复杂的算法来做,这是以数据结构为中心的。而我的实践是以图形对象为中心的。
  呵呵,这年头,用java2d好想不多啊!

#8


up

#9


没什么问题。。。。简单着呢。。呵呵。

#10


用PropertyChangeListener和PropertyChangeEvent不用判断鼠标位置。表现节点的组件添加
addPropertyChangeListener(),接点不用画,用JLable就可以了。

#11


谢谢大家的帮忙,我现在打算用jgraph来做,今天看了其文档和一些实例,应该能实现我的要求,正在研究中,不过时间真的比较紧,那位兄弟用用过jgraph,能不能教教我,我的msn:ewei3000112@hotmail.com, QQ:305953921.

#12


请问哪位有用过jgraph吗,我现在需要在applet上画一个圆形节点,谁能教教我吗