You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.RectanglePointDimension,错误就会消失。

方案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

火山引擎 最新活动