Прямоугольник Java: почему ошибка «getPreferredSize ()» - PullRequest
0 голосов
/ 09 июня 2019

Почему ошибка этого кода:

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

Ошибка:

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();
       }    
}

1 Ответ

2 голосов
/ 09 июня 2019

Вы делаете это (или что-то подобное) 3 раза в своем коде:

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

Это не компилируемая Java.Как сообщение об ошибке компиляции говорит:

     constructor Rectangle(Point, Dimension) is undefined 

Почему это говорит?В конце концов, в java.awt.Rectangle ( javadoc ) есть конструктор Rectangle(Point, Dimension).

Хорошо, давайте рассмотрим фактические типы.

  • Первый аргументявно 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) apis может привести к проблемам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...