Java代码报错:Rectangle(Point, Dimension)构造函数未定义,求调试帮助
解决Draw2D中Rectangle构造方法未定义的编译错误
我来帮你搞定这个头疼的编译错误!咱们先拆解一下问题出在哪:
错误原因分析
你看到的报错The constructor Rectangle(Point, Dimension) is undefined,核心问题是类的混淆:
- 你导入了
java.awt.*,这会让编译器默认把代码里的Rectangle解析成java.awt.Rectangle; - 但
java.awt.Rectangle根本没有(Point, Dimension)这个构造方法,它的构造参数要么是单独的坐标+宽高,要么是单个Point/Dimension,不支持两个参数的组合; - 而你用的
XYLayout是Eclipse Draw2D框架的组件,它需要的是Draw2D自己的org.eclipse.draw2d.geometry.Rectangle,这个类才支持(Point, Dimension)的构造,刚好能匹配你代码里的new Point(10,10)和andy.getPreferredSize()的参数组合。
两种解决方案
方案1:移除多余的AWT导入(推荐)
你的代码里其实根本不需要java.awt.*的导入——你用到的颜色已经用了Draw2D的ColorConstants,Point和Dimension也可以用Draw2D自带的类。直接删掉这行导入:
import java.awt.*;
这样编译器就会自动使用Draw2D的org.eclipse.draw2d.geometry.Rectangle、Point和Dimension,错误就会消失。
方案2:显式指定Draw2D的Rectangle类
如果你因为某些原因必须保留java.awt.*的导入,那就在所有用到Rectangle的地方显式写出完整类名:
layout.setConstraint(andy, new org.eclipse.draw2d.geometry.Rectangle(new Point(10, 10), andy.getPreferredSize())); layout.setConstraint(betty, new org.eclipse.draw2d.geometry.Rectangle(new Point(230, 10), betty.getPreferredSize())); layout.setConstraint(carl, new org.eclipse.draw2d.geometry.Rectangle(new Point(120, 120), carl.getPreferredSize()));
(注意:这里的Point也需要确保是Draw2D的,如果你同时用了AWT的Point,那也要显式写成org.eclipse.draw2d.geometry.Point)
修改后的完整代码示例
这里是移除java.awt.*导入后的完整代码,你可以直接运行:
import org.eclipse.draw2d.*; import org.eclipse.draw2d.geometry.Point; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class testdot { private void run() { Shell shell = new Shell(new Display()); shell.setSize(365, 280); shell.setText("Genealogy"); shell.setLayout(new GridLayout()); Canvas canvas = createDiagram(shell); canvas.setLayoutData(new GridData(GridData.FILL_BOTH)); Display display = shell.getDisplay(); shell.open(); while (!shell.isDisposed()) { while (!display.readAndDispatch()) { display.sleep(); } } } private IFigure createPersonFigure(String name) { RectangleFigure rectangleFigure = new RectangleFigure(); rectangleFigure.setBackgroundColor(ColorConstants.lightGray); rectangleFigure.setLayoutManager(new ToolbarLayout()); rectangleFigure.setPreferredSize(100, 100); rectangleFigure.add(new Label(name)); return rectangleFigure; } private Canvas createDiagram(Composite parent) { Figure root = new Figure(); root.setFont(parent.getFont()); XYLayout layout = new XYLayout(); root.setLayoutManager(layout); IFigure andy = createPersonFigure("Andy"); root.add(andy); layout.setConstraint(andy, new org.eclipse.draw2d.geometry.Rectangle(new Point(10, 10), andy.getPreferredSize())); IFigure betty = createPersonFigure("Betty"); root.add(betty); layout.setConstraint(betty, new org.eclipse.draw2d.geometry.Rectangle(new Point(230, 10), betty.getPreferredSize())); IFigure carl = createPersonFigure("Carl"); root.add(carl); layout.setConstraint(carl, new org.eclipse.draw2d.geometry.Rectangle(new Point(120, 120), carl.getPreferredSize())); Canvas canvas = new Canvas(parent, SWT.DOUBLE_BUFFERED); canvas.setBackground(ColorConstants.white); LightweightSystem lws = new LightweightSystem(canvas); lws.setContents(root); return canvas; } public static void main(String[] args) { new testdot().run(); } }
内容的提问来源于stack exchange,提问作者Ensora




