📄 panel1.java
字号:
package controlarc;import java.awt.*;import javax.swing.JPanel;import java.awt.event.*;import java.awt.geom.*;import java.util.*;/** * <p>Title: Control Arc Demo</p> * <p>Description: This is a Control Arc demo</p> * <p>Copyright: Copyright (c) 2002</p> * <p>Company: d6-125</p> * @author Liujun * @version 1.0 */public class Panel1 extends JPanel { BorderLayout borderLayout1 = new BorderLayout(); //在此添加自己的变量 int n = 4;//一个弧角度有四个控制点 int current = -1;//当前的控制点 static double SIZE = 12.0;//控制点大小 Point2D [] points = new Point2D[4];//四个控制点 public Panel1() { try { jbInit(); } catch(Exception ex) { ex.printStackTrace(); } } void jbInit() throws Exception { this.setForeground(Color.red); this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { this_mouseDragged(e); } }); this.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(MouseEvent e) { this_mousePressed(e); } public void mouseReleased(MouseEvent e) { this_mouseReleased(e); } }); this.setLayout(borderLayout1); //add code here //产生四个初始的点,两个用于控制大小,另外两个用于控制角度 points[0] = new Point2D.Double(100.0, 100.0); points[1] = new Point2D.Double(200.0, 200.0); points[2] = new Point2D.Double(150.0, 250.0); points[3] = new Point2D.Double(250.0, 150.0); } void this_mousePressed(MouseEvent e) { Point p = e.getPoint(); for (int i = 0; i < n; i++) { double x = points[i].getX() - SIZE / 2; double y = points[i].getY() - SIZE / 2; Rectangle2D r = new Rectangle2D.Double(x, y, SIZE, SIZE); if (r.contains(p))//判断当前鼠标位置是否在控制点上 { current = i;//如果是,则设current为当前点 return; } } } void this_mouseReleased(MouseEvent e) { current = -1;//鼠标被释放 } void this_mouseDragged(MouseEvent e) { if (current == -1) return;//如果鼠标没有按下,则返回 points[current] = e.getPoint();//设置当前点为鼠标的位置 this.repaint();//重绘图形 } protected void paintComponent(Graphics g) { /**@todo: Override this javax.swing.JComponent method*/ super.paintComponent( g); if (points == null) return; Graphics2D g2 = (Graphics2D)g;//使用Java 2D for (int i = 0; i < n; i++)//画控制点 { double x = points[i].getX() - SIZE / 2; double y = points[i].getY() - SIZE / 2; g2.fill(new Rectangle2D.Double(x, y, SIZE, SIZE)); } //重画弧角度 //计算中心位置 double centerX = (points[0].getX() + points[1].getX()) / 2; double centerY = (points[0].getY() + points[1].getY()) / 2; //计算高度和宽度 double width = Math.abs(points[1].getX() - points[0].getX()); double height = Math.abs(points[1].getY() - points[0].getY()); //计算起始角度 double distortedStartAngle = Math.toDegrees(Math.atan2(-(points[2].getY() - centerY) * width, (points[2].getX() - centerX) * height)); //计算结束角度 double distortedEndAngle = Math.toDegrees(Math.atan2(-(points[3].getY() - centerY) * width, (points[3].getX() - centerX) * height)); //计算角度差,纠正角度偏差 double distortedAngleDifference = distortedEndAngle - distortedStartAngle; if (distortedStartAngle < 0) distortedStartAngle += 360; if (distortedAngleDifference < 0) distortedAngleDifference += 360; //创建弧对象 Arc2D Arc = new Arc2D.Double(0, 0, 0, 0, distortedStartAngle, distortedAngleDifference, Arc2D.OPEN); Arc.setFrameFromDiagonal(points[0], points[1]); //创建两边控制线和角度控制线 GeneralPath gPath = new GeneralPath(); gPath.append(Arc, false); Rectangle2D Rectangle = new Rectangle2D.Double(); Rectangle.setFrameFromDiagonal(points[0], points[1]); gPath.append(Rectangle, false); Point2D center = new Point2D.Double(centerX, centerY); gPath.append(new Line2D.Double(center, points[2]), false); gPath.append(new Line2D.Double(center, points[3]), false); g2.draw(gPath); g2.drawString("中心点:"+String.valueOf(center)+" 角度差:"+String.valueOf(distortedAngleDifference),10,10); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -