首页 > 解决方案 > java 矩形:为什么错误“getPreferredSize()”

问题描述

为什么错误此代码:

layout.setConstraint(andy, new Rectangle(new Point(10, 10), andy.getPreferredSize()));

错误:<br>

The constructor Rectangle(Point, Dimension) is undefined
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
The constructor Rectangle(Point, Dimension) is undefined
The constructor Rectangle(Point, Dimension) is undefined
The constructor Rectangle(Point, Dimension) is undefined

at testdot.testdot.createDiagram(testdot.java:66)
at testdot.testdot.run(testdot.java:23)
at testdot.testdot.main(testdot.java:92)

我不明白这个错误。请帮助调试错误代码。

import java.awt.*;
import org.eclipse.draw2d.*;
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) {
       // Create a root figure and simple layout to contain
       // all other figures
       Figure root = new Figure();
       root.setFont(parent.getFont());
       XYLayout layout = new XYLayout();
       root.setLayoutManager(layout);
       // Add the father "Andy"
       IFigure andy = createPersonFigure("Andy");
       root.add(andy);
       layout.setConstraint(andy,
       new Rectangle(new Point(10, 10), andy.getPreferredSize()));
       // Add the mother "Betty"
       IFigure betty = createPersonFigure("Betty");
       root.add(betty);
       layout.setConstraint(betty,
       new Rectangle(new Point(230, 10), betty.getPreferredSize()));
       // Add the son "Carl"
       IFigure carl = createPersonFigure("Carl");
       root.add(carl);
       layout.setConstraint(carl,
       new Rectangle(new Point(120, 120), carl.getPreferredSize()));



       // Create a canvas to display the root figure
       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();
       }    
}

标签: javaswt

解决方案


您在代码中执行此操作(或类似操作) 3 次:

     new Rectangle(new Point(10, 10), andy.getPreferredSize()));

它不是可编译的Java。正如编译错误消息所说:

     constructor Rectangle(Point, Dimension) is undefined 

为什么这么说?毕竟,(javadocRectangle(Point, Dimension)中有一个构造函数。java.awt.Rectangle

那么让我们看看实际的类型。

  • 第一个参数显然是 a java.awt.Point。好的。
  • 第二个参数是对IFigure实例的方法调用的结果。嗯。

如果您查看文档,IFigure您会发现这些getPreferredSize方法返回一个org.eclipse.draw2d.geometry.Dimension对象,而不是一个java.awt.Dimension.

基本上,您是在混淆 SWT 和 AWT 类型。

import java.awt.*;

那是错的。由于您(显然)正在为 Eclipse / SWT 平台编程,因此您应该专门导入和使用 SWT 类。将 SWT 与 AWT(或 Swing、JavaFX 或 Android)api 混合使用会导致问题。


推荐阅读