现在接到一个做流程图的活,要求用java实现,我试着用java作了个面板,新建环节用矩形控件显示,新建条件用菱形显示,当新建环节或者分支条件时,就自动画出一条带箭头的连接线段表示流向,由于以前没做过这方面的开发,以上我只能想到这些,可是要求中还特别提到:可以拖动环节或者条件也就是矩形和菱形,而且在拖动的同时,带箭头的连接线要根据控件拖动自动伸长或缩短,而且各个连线不能重叠。
看到这我就不知道如何实现了,应该怎样处理呢,求高手指点方法?
看到这我就不知道如何实现了,应该怎样处理呢,求高手指点方法?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
public class elastic { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame f = new DrawFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.show();
}}
class DrawFrame extends JFrame
{
public DrawFrame()
{
setTitle("橡皮筋程序");
setSize(WIDTH,HEIGHT);
Container contentPane = getContentPane();
DrawPanel p = new DrawPanel();
contentPane.add(p);
contentPane.add(p.statusPanel,BorderLayout.SOUTH);
}
public static final int WIDTH = 600;
public static final int HEIGHT = 600;
}
class DrawPanel extends JPanel implements MouseListener,MouseMotionListener
{
public DrawPanel()
{
lines = new ArrayList();
colors = new ArrayList();
setBackground(Color.WHITE);
this.addMouseMotionListener(this);
this.addMouseListener(this);
statusPanel= new JPanel();
//statusPanel.setSize(40, 200);
//statusPanel.setBackground(Color.RED);
statusPanel.setLayout(new BorderLayout());
statusLabel = new JLabel(" " );
statusPanel.add(statusLabel,BorderLayout.CENTER);
}
public void setDrawColor()
{
setForeground(focucolor);
}
public void mouseDragged(MouseEvent e)
{
x2 = e.getX();
y2 = e.getY();
statusLabel.setText(" 横坐标为:"+x2+"纵坐标为:"+y2);
repaint();
}
public void mouseMoved(MouseEvent e)
{
}
/////下面五个方法是实现MouseListener的接口的方法
public void mousePressed(MouseEvent e)
{
x1 = e.getX();
y1 = e.getY();
x2 = -1;
repaint();
}
public void mouseReleased(MouseEvent e)
{
colors.add(getForeground());
lines.add(new Line2D.Double(x1, y1, e.getX(), e.getY()));
x2 = -1;
statusLabel.setText(" ");
repaint();
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setColor(this.getForeground());
int count = lines.size();
for(int i = 0;i<count;i++)
{
Line2D.Double line = (Line2D.Double)lines.get(i);
g2.setColor((Color)colors.get(i));
g2.draw(line);
}
if (x2 != -1)
g2.drawLine(x1, y1, x2, y2);
}
//用来清除图像
public void clearCanvas()
{
lines.clear();
colors.clear();
x2 = -1;
repaint();
}
private ArrayList lines;
private ArrayList colors;
private int x1,y1,x2,y2;
private Color focucolor;
private JLabel statusLabel;
JPanel statusPanel;
}
----------------------------------------------------------------------
你说的应该是指曲线吧,如果是曲线,做法也是一样的,曲线也是由一些小直线段逼近组成的,对每个小直线段进行判断就行了,这个主要的就是算法,没有必须把曲线中的所有点都求出来,那样比较浪费空间.或许你说的是如果是水平或垂直的线很容易实现,对有倾斜度不为0或90的线不容易,其实是一样的,因为最后都是用像素(整形值)来进行指定的,所以计算时要用一个近似值,取鼠标的X坐标来计算斜线上的Y坐标,如果与鼠标坐标的差值在指定范围内,一般是用(int)Math.floor(Y + 0.5) == 鼠标的Y坐标,那么就判断定鼠标的Y坐标在斜线上.这样,对一条斜线会处理了,对整个曲线也就会处理了.
我看过Eclipse里的用struts配置文件可以建流程图的功能,它新建两个环节之间的流向线的同时还在流向线段上加了文字标签,如果我用java想实现这个功能应该如何做呢?