приобретая свойства с плавающей точкой от суперкласса до супер - PullRequest
0 голосов
/ 26 апреля 2019

Я создаю проект рисования, такой как приложение для школы, и в моем текущем коде у меня есть несколько подклассов и супер.Супер должен содержать массив фигур для рисования, и каждый объект формы должен иметь свой собственный подкласс, который я позже должен будет поместить в массив и вызвать из приложения.Я должен использовать JDesktopPane и JInternalFrame, я не могу использовать Arraylists, и я в настоящее время застрял при попытке привести Float моего подкласса RectDraw к моему супер.Все это, прежде чем наконец-то вложить инструменты в супер по имени MyShapes.любая помощь приветствуется.Я не очень много использовал jdesktopPane, и я плохо справляюсь с кастингом.

        public class myShapes {

            public void paint(Graphics g) {

                graphSettings = (Graphics2D)g;
                graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                graphSettings.setStroke(new BasicStroke(4));

                Iterator<Color> strokeCounter = shapeStroke.iterator();
                Iterator<Color> fillCounter = shapeFill.iterator();
                Iterator<Float> transCounter = transPercent.iterator();

                for (Shape s : shapes){
                    graphSettings.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transCounter.next()));
                    graphSettings.setPaint(strokeCounter.next());
                    graphSettings.draw(s);
                    graphSettings.setPaint(fillCounter.next());
                    graphSettings.fill(s);
                    }


                if (drawStart != null && drawEnd != null){

                    graphSettings.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.40f));
                    graphSettings.setPaint(Color.LIGHT_GRAY);

                    Shape aShape = null;                            

                    if (currentAction == 2){                            
                        RectDraw drawRectangle = new RectDraw();
                        aShape = drawRectangle(x1, y1, x2, y2);                     
                    } 
                    else if (currentAction == 3){                           
                        CircleDraw drawEllipse = new CircleDraw();
                        aShape = drawEllipse(x1, y1, x2, y2);
                    } 
                    else if (currentAction == 4) {
                        LineDraw drawLine = new LineDraw();
                        aShape = drawLine(x1, y1, x2, y2);
                    }

                    graphSettings.draw(aShape);
                    }
                }
            }

Это мои подклассы

package mainPackage;

import java.awt.geom.Rectangle2D;

public class RectDraw extends myShapes {

public Rectangle2D.Float drawRectangle(int x1, int y1, int x2, int y2) {

    int RDx, RDy, RDwidth, RDheight;

    RDx = Math.min(x1, x2);
    RDy = Math.min(y1, y2);
    RDwidth = Math.abs(x1 - x2);
    RDheight = Math.abs(y1 - y2);

    return new Rectangle2D.Float(RDx, RDy, RDwidth, RDheight);
}
}

, остальные абсолютно такие же, за исключением имен

public class CircleDraw extends myShapes {

public Ellipse2D.Float drawEllipse(int x1, int y1, int x2, int y2){

     int x = Math.min(x1, x2);
     int y = Math.min(y1, y2);
     int width = Math.abs(x1 - x2);
     int height = Math.abs(y1 - y2);

     return new Ellipse2D.Float(x, y, width, height);
 }
}


public class LineDraw extends myShapes {

    public Line2D.Float drawLine(int x1, int y1, int x2, int y2) {

        return new Line2D.Float(x1, y1, x2, y2);
    }
}

Я не могу получить разрешение переменной

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Я хотел бы добавить, что это не очень хорошая иерархия классов.Ваши фигуры должны исходить из базового абстрактного класса формы, тогда в вашем основном методе вы можете создать список фигур.

Вы не можете получить доступ к объектам "суперкласса", потому что фигуры не являются переменными экземпляра.Я бы не стал использовать класс myShapes, но, если вам нужно, вы, вероятно, должны разделить методы Shape и класс Shape.java и позволить классу myShapes.java позаботиться о создании списка форм.

abstract class Shape(){
    abstract void draw();
}

Тогда ваши другие формы подклассаследует расширить и реализовать метод рисования:

public class Rectangle extends Shape(){
    //instance variables
    public void draw();
}

По основному методу:

Shape[] myShapesArray = new Shape()[10];

Я бы предложил поискать фабричный шаблон. Factory Будет разумно использовать его и очистить ваш код.Кроме того, ограничение массива и отсутствие использования списков усложняют управление приложениями для рисования.Поскольку вам всегда нужно знать, сколько элементов вам нужно при инициализации массива.

0 голосов
/ 26 апреля 2019
  RectDraw drawRectangle = new RectDraw();
  aShape = drawRectangle(x1, y1, x2, y2);

На основе 1-й строки drawRectangle является экземпляром RectDraw;

Во второй строке вы путаете ваше ссылочное имя "drawRectangle" с методом с тем же именем в классе RectDraw

Вы должны вызывать метод, используя экземпляр вашего класса RectDraw, как показано ниже ... изменяя имя экземпляра для ясности

  RectDraw rectDraw = new RectDraw();
  aShape = rectDraw.drawRectangle(x1, y1, x2, y2); 

Та же проблема для всех фигур ..

Также выВы создаете много экземпляров в цикле, что не является хорошей практикой.

И ваш вопрос слишком запутанный, пожалуйста, постарайтесь быть максимально ясным, задавая вопросы, обращайтесь: - https://stackoverflow.com/help/how-to-ask:)

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