2010-03-20 36 views
1

我需要绘制自定义形状。现在,当用户点击面板上的几个点时,我使用多边形创建一个形状。的Java Swing自定义形状(2D图形)

public void mouseClicked(MouseEvent e) { 
      polygon.addPoint(e.getX(), e.getY()); 
      repaint(); 
     } 

但我不知道这是否是绘制自定义形状的最佳方式。

应该可以编辑绘制的图形

  • 调整
  • 改变其填充颜色
  • 改变笔触颜色
  • 复制/粘贴
  • 移动单多边形
  • 的点...

我看到人们创建自己的类实现Shape类和使用的GeneralPath。但我不知道这是否是一个好方法。

现在我可以创建自己的形状与多边形(或与GeneralPath),但我不知道如何将所有编辑功能附加到我自己的形状(编辑功能我的意思是调整大小,移动等从以上)

我希望有人能告诉我一个办法做到这一点也许写的代码,一点点地证明这一点。

在此先感谢!

回答

5

在回答你的问题,我肯定会做你形容一个作为AWT的解决方案 - 这样你可以跟踪创建的对象,并能够让用户重新加载到编辑画布而更可能每个用户创建将是一个“层”,而不是摇摆层容器形状,但是这将存储和跟踪绘制什么形状,并能重绘他们的对象 - 主要的事情要记住是“绘制顺序”。基本上你可以做到这一点,通过分配每个对象或一组对象是你的“形状”,以便有一个Z = [0-100]等(100,可以是任何数字),它决定了每个对象/形状的顺序被吸引进来,因此他们如何相互打好对方。

基本上你将需要一个形状类存储

应该可以编辑绘制 形状:

调整大小改变其填满颜色变化 笔触颜色复制/粘贴它移动了一个 单点的多边形...

你勾画了一个存储对象/管理器,它将枚举形状类对象/创建的实例。这些类将或多或少地包含在java.awt.Canvas容器中,该容器实际上可以处理所有的图形。

晴你想使用过的Swing AWT由于Swing不是线程安全的 - 这样你不“画自己在角落里”在设计早期。另一个原因是这是一种需要以用户习惯的方式进行响应和交互的实现。 Swing是建立在AWT上的,并且增加了很多复杂性,像这样的应用程序并不需要。在你将要创建一个类的自定义组件,这正是Canvas对象是平均到 提供,如果太阳会这个机智早些时候保持他们不会都涌入了 混乱秋千竟然是。开发人员社区 - 我自己包括 - 很好地创造了许多Swing在“光滑”和基于组件的设计中提供的内容,但我们构建的完全基于AWT。当Swing进入现场时,Java作为一个GUI平台变得非常复杂,开始Sun和Java走上了一条光滑的道路......

另外,你必须决定你最终想要什么,以便控制你在这里创建的内容。如果你需要它,并且不需要在将来修改它,那么有很多开源的例子可以做到这一点 - 大部分是免费的。如果你想自己做,那么希望我上面提到的和下面的橡皮圈代码足以让你在那里,并更深入地了解Java作为GUI。我个人希望你自己承担 - 这种语言迫切需要更多真正理解语言及其设计的“核心”人,而不仅仅是如何“工作”框架,如Hibernate和Spring等...

好好运希望这有助于

WM

至于“橡皮筋”选择代码去,这是我的我已经在过去使用的,只考虑它GLP,当你需要使用它?

首先是监听器接口:

/* 
* RubberBandListener.java 
* 
* Created on August 18, 2005, 3:27 PM 
* 
* To change this template, choose Tools | Options and locate the template under 
* the Source Creation and Management node. Right-click the template and choose 
* Open. You can then make changes to the template in the Source Editor. 
*/ 
package com.ges.util; 

import java.util.EventListener; 
import java.awt.Rectangle; 

/** 
* 
* @author mstemen 
*/ 
public interface RubberBandListener extends EventListener { 

    public abstract void notifyBounds(Rectangle boundingBox); 
} 

这是这是一个自定义的AWT组件的类 - 它应该是罚款或者摇摆/ AWT甚至可能SWT

/* 
* RubberBandSelect.java 
* 
* Created on August 18, 2005, 9:11 AM 
* By Matthew Stemen/Wintermute Studios for util like use 
* 
*/ 
package com.ges.util; 

import javax.swing.*; 
import java.awt.*; 
import java.util.*; 
import java.awt.event.*; 

/** 
* 
* @author mstemen 
*/ 
public class RubberBandSelect extends Component { 

    /** Creates a new instance of RubberBandSelect */ 
    private Point startPoint = null; 
    private Point endPoint = null; 
    private Graphics hostGraphics = null; 
    private Component hostComponent = null; 
    private Color bandColor = Color.ORANGE.darker().darker(); 
    private boolean started = false; 
    private boolean eraseSomething = false; 
    private int startX, endX, startY, endY = 0; 
    private Rectangle boundingBox; 
    private StringBuilder QuadrantMessage = null; 
    private HashSet<RubberBandListener> listeners = 
     new HashSet<RubberBandListener>(); 
    private int width = 0; 
    private int height = 0; 

    public RubberBandSelect(Component c) { 
     hostComponent = c; 
     hostGraphics = c.getGraphics(); 
    } 

    public void addListener(RubberBandListener l) { 
     listeners.add(l); 
    } 

    public void paint(Graphics g) { 
     draw(); 
    } 

    public void erase() { 
     if (eraseSomething) { 
//   hostComponent.repaint(); 
      draw(); 
      eraseSomething = false; 
     } 
    } 

    private void draw() { 
     hostGraphics = hostComponent.getGraphics(); 
     if (hostGraphics != null) { 
      try { 
       /// hostGraphics.setXORMode(hostComponent.getBackground()); 
       erase(); 
       drawRubberBand(); 
       eraseSomething = false; 
      } finally { 
//    hostGraphics.dispose(); 
      } 
     } 
    } 

    private void drawRubberBand() { 
     if (!started) { 
      return; 
     } 

     hostGraphics = hostComponent.getGraphics(); 
     if (hostGraphics == null) { 
      return; 
     } 

     if (startPoint == null || endPoint == null) { 
      return; 
     } 

     hostGraphics.setColor(bandColor); 

     if (endX > startX && endY > startY) { 
      boundingBox = new Rectangle(startX, startY, endX - startX, endY - startY); 
      hostGraphics.drawRect(startX, startY, endX - startX, endY - startY); 

      QuadrantMessage = new StringBuilder("Drawing in Q - IV X1="); 
      width = endX - startX; 
      height = endY - startY; 
      //UDTMgr.getMgr().sendStatusMessage("Drawing Rect: " + "(X1=" + startX + ",Y1=" + startY + ") (X2=" + endX + ",Y2=" + endY + ")" ); 
     } else if (endX < startX && endY < startY) { 
      boundingBox = new Rectangle(endX, endY, startX - endX, startY - endY); 
      hostGraphics.drawRect(endX, endY, startX - endX, startY - endY); 
      //UDTMgr.getMgr().sendStatusMessage("Drawing Rect: " + "(X1=" + startX + ",Y1=" + startY + ") (X2=" + endX + ",Y2=" + endY + ")" ); 
      QuadrantMessage = new StringBuilder("Drawing in Q - II X1="); 
      width = startX - endX; 
      height = startY - endY; 

     } else if (endX > startX && endY < startY) { 
      boundingBox = new Rectangle(startX, endY, endX - startX, startY - endY); 
      hostGraphics.drawRect(startX, endY, endX - startX, startY - endY); 
      //UDTMgr.getMgr().sendStatusMessage("Drawing Rect: " + "(X1=" + startX + ",Y1=" + startY + ") (X2=" + endX + ",Y2=" + endY + ")" ); 
      QuadrantMessage = new StringBuilder("Drawing in Q - I X1="); 
      width = endX - startX; 
      height = startY - endY; 
     } else if (endX < startX && endY > startY) { 
      boundingBox = new Rectangle(endX, startY, startX - endX, endY - startY); 
      hostGraphics.drawRect(endX, startY, startX - endX, endY - startY); 
      //UDTMgr.getMgr().sendStatusMessage("Drawing Rect: " + "(X1=" + startX + ",Y1=" + startY + ") (X2=" + endX + ",Y2=" + endY + ")" ); 
      QuadrantMessage = new StringBuilder("Drawing in Q - III X1="); 
      width = startX - endX; 
      height = endY - startY; 
     } 


    } 

    public void assignToCompoent(Component c) { 
     this.hostComponent = c; 
     hostGraphics = c.getGraphics(); 
    } 

    public void update(Graphics g) { 
     drawRubberBand(); 
    } 

    public Point getStartPoint() { 
     return startPoint; 
    } 

    public void setStartPoint(Point startPoint) { 
     this.startPoint = startPoint; 
     startX = (int) startPoint.getX(); 
     startY = (int) startPoint.getY(); 
     QuadrantMessage = new StringBuilder(); 
     // UDTMgr.getMgr().sendStatusMessage("RubberBandSelect--Started: point is: X=" + startX + " Y=" + startY); 
     // drawRubberBand(); 
     // started = true; 
    } 

    public Point getEndPoint() { 
     return endPoint; 
    } 

    public void setEndPoint(Point endPoint) { 

     this.endPoint = endPoint; 
     clear(); 
     endX = (int) endPoint.getX(); 
     endY = (int) endPoint.getY(); 
     // UDTMgr.getMgr().sendStatusMessage("RubberBandSelect--Streching: points are: X=" + startX + " Y=" + startY + " Ending Point is: X=" + endX + " Y="+ endY); 

     draw(); 
     notifyListeners(); 
     started = true; 
    } 

    public Color getBandColor() { 
     return bandColor; 
    } 

    public void setBandColor(Color bandColor) { 
     this.bandColor = bandColor; 
    } 

    public void setForeground(Color color) { 
     this.bandColor = color; 

    } 

    private void clear() { 
     hostGraphics = hostComponent.getGraphics(); 
     if (hostGraphics == null) { 
      return; 
     } 
     // hostGraphics.setXORMode(hostComponent.getBackground()); 
     try { 
      // hostGraphics.setXORMode(hostComponent.getBackground()); 
      drawRubberBand(); 
     } finally { 
//   hostGraphics.dispose(); 
     } 
    } 

    public void breakBand() { 
     startPoint = null; 
     endPoint = null; 
     started = false; 
     boundingBox = new Rectangle(0, 0, 0, 0); 
     if (hostGraphics != null) { 
      hostGraphics.dispose(); 
     } 
     clear(); 
     hostComponent.repaint(); 
     // UDTMgr.getMgr().sendStatusMessage("RubberBandSelect-- Broke band, click to restart"); 
    } 

    public boolean isStarted() { 
     return started; 
    } 

    public void notifyListeners() { 
     Iterator<RubberBandListener> it = listeners.iterator(); 

     while (it.hasNext()) { 
      it.next().notifyBounds(boundingBox); 
     } 
    } 

    public void redraw(Graphics g) { 
     if (startPoint == null || endPoint == null) { 
      return; 
     } 

     g.setColor(bandColor); 
//  hostGraphics.setPaintMode(); 
     // hostComponent.repaint(); 
     // four way case state to determine what quadrant to draw in 
     if (endX > startX && endY > startY) { 
      boundingBox = new Rectangle(startX, startY, endX - startX, endY - startY); 
      g.drawRect(startX, startY, endX - startX, endY - startY); 

      QuadrantMessage = new StringBuilder("Drawing in Q - IV X1="); 
      width = endX - startX; 
      height = endY - startY; 
      //UDTMgr.getMgr().sendStatusMessage("Drawing Rect: " + "(X1=" + startX + ",Y1=" + startY + ") (X2=" + endX + ",Y2=" + endY + ")" ); 
     } else if (endX < startX && endY < startY) { 
      boundingBox = new Rectangle(endX, endY, startX - endX, startY - endY); 
      g.drawRect(endX, endY, startX - endX, startY - endY); 
      //UDTMgr.getMgr().sendStatusMessage("Drawing Rect: " + "(X1=" + startX + ",Y1=" + startY + ") (X2=" + endX + ",Y2=" + endY + ")" ); 
      QuadrantMessage = new StringBuilder("Drawing in Q - II X1="); 
      width = startX - endX; 
      height = startY - endY; 

     } else if (endX > startX && endY < startY) { 
      boundingBox = new Rectangle(startX, endY, endX - startX, startY - endY); 
      g.drawRect(startX, endY, endX - startX, startY - endY); 
      //UDTMgr.getMgr().sendStatusMessage("Drawing Rect: " + "(X1=" + startX + ",Y1=" + startY + ") (X2=" + endX + ",Y2=" + endY + ")" ); 
      QuadrantMessage = new StringBuilder("Drawing in Q - I X1="); 
      width = endX - startX; 
      height = startY - endY; 
     } else if (endX < startX && endY > startY) { 
      boundingBox = new Rectangle(endX, startY, startX - endX, endY - startY); 
      g.drawRect(endX, startY, startX - endX, endY - startY); 
      //UDTMgr.getMgr().sendStatusMessage("Drawing Rect: " + "(X1=" + startX + ",Y1=" + startY + ") (X2=" + endX + ",Y2=" + endY + ")" ); 
      QuadrantMessage = new StringBuilder("Drawing in Q - III X1="); 
      width = startX - endX; 
      height = endY - startY; 
     } 
    } 

    public Rectangle getBoundingBox() { 
     return boundingBox; 
    } 
} 
+1

我重新格式化了您的示例;如果不正确请回复。 Wintermute! – trashgod 2010-03-20 21:09:42

+0

谢谢!我是一名Java初学者,但我会检查这个代码,我想它会帮助我很多! 现在调查这个代码是如何工作的,并尝试修改它,以便它符合我的需求。 (和框架,以及我宁愿现在不使用它们)) – juFo 2010-03-20 21:20:29

+0

谢谢trashgod我有点快 - 它确实仍然编译 - 因为我从一个相当复杂的GUI框架中抽象出来我写了一段时间后,再加上我仍然得到这个网站提供的编辑能力仍然悬而未决。 juFo:非常欢迎。多年来,我一直都是Java的佼佼者。为此,任何机会我都可以让别人认为它不仅仅是获得“快速”解决方案的一种方式,而是希望真正把它理解为对大多数问题空间的整体解决方案。 – Wintermut3 2010-03-20 22:14:57

2

你有没有看Graphics类在Java中(也有Polygon类)?有绘制和填充多边形方法,每个方法都可以采用x坐标和y坐标的数组。通过使用这些数组,你应该能够相当容易地改变点的位置。就像你可以通过平均移动所有点一样来改变它们的大小,或者复制和粘贴。改变颜色就像填充新颜色和重新绘制一样简单。

+0

而当我想调整它的大小我想自定义光标和边界框来显示我可以在哪里点击并拖动来调整它的大小,我该怎么做? – juFo 2010-03-20 16:13:22

+0

您可以更改事件上的光标。就像你可以添加一个鼠标点击侦听器,或鼠标拖动侦听器,或类似的东西。当您在绘画方法中拖动鼠标时,您可以设置一些布尔变量。所以,如果你拖动,你可以在你想要的地方绘制你的边界框,或者做同样类型的东西来切割和粘贴。 – 2010-03-20 17:39:56

+0

http://blog.codebeach.com/2008/02/using-custom-cursors-in-java。html 这是显示如何使用自定义光标的链接。 – 2010-03-20 17:43:34