在回答你的问题时,我肯定会做你所描述的 AWT 解决方案——这样你就可以跟踪创建的对象并能够允许用户将它们重新加载到编辑画布上,并且很可能每个形状用户创建的将是一个“层”,而不是 Layer Swing 容器,而是一个可以存储和跟踪绘制的形状并能够重绘它们的对象——要记住的主要事情是“绘制顺序”。基本上,您可以通过将“形状”的每个对象或对象组指定为 Z=[0-100] 等(100,可以是任何数字)来完成此操作,这决定了每个对象/形状的顺序被吸引,因此它们如何相互重叠。
基本上你需要一个形状类来存储
应该可以编辑绘制的
形状:
调整大小改变其填充颜色改变
描边颜色复制/粘贴它移动
多边形的单点...
您概述了一个存储对象/管理器,它将枚举创建的形状类对象/实例。这些类或多或少地包含在 java.awt.Canvas 容器中,该容器将实际处理所有图形。
大多数情况下,您希望使用 awt 而不是 Swing,因为 Swing 不是线程安全的——这样您就不会在设计的早期“把自己逼到角落”。另一个原因是这是一个需要以用户习惯的方式进行响应和交互的实现。 Swing 是基于 AWT 构建的,并增加了很多像这样的应用程序不需要的复杂性。总而言之,您将创建一个类自定义组件,这正是 Canvas 对象的含义
提供,如果 Sun 早点保持这种策略,他们就不会进入
Swing 原来是一团糟……开发人员社区(包括我自己)正在努力创建 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 组件的类 - 它应该可以在 Swing/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;
}
}