Как масштабировать основные рисунки? - PullRequest
0 голосов
/ 29 апреля 2019

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

Я уже подготовил классы, которые хранят информацию о случайных фигурах в списке (прямоугольники, овалы и т. Д.).У меня нет проблем с рисованием их всех, но я не могу справиться с проблемой масштабирования.Мои решения ничего не меняют и не заставляют исчезать все формы.

public class Shape extends JPanel{
    int x, y,width,height,red,green,blue;
    double scX, scY; //scale x and y

    public Shape(int x, int y, int width, int height, int red, int green, int blue) {
//...long constructor
        scX=1;
        scY=1;
    }
    void randomizeValues(){...}

        void setScale(double x, double y) {
        this.scX = x;
        this.scY = y;
    }
}

public class Rectangle extends Shape{

    public Rectangle(int x, int y, int width, int height, int red, int green, int blue) {
        super(x, y, width, height, red, green, blue);
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        graphics.fillRect((int)(x*scX), (int)(y*scY), (int)(width*scX), (int)(height*scY));
    }
}


class Window extends JFrame {

    int defaultWidth = 768;
    int defaultHeight = 512;
    List<Shape> paintList = new ArrayList<>();

 public Window() {
        setTitle("Shape");
        add(new DrawShape);
        setSize(defaultWidth, defaultHeight);
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

class DrawShape extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (int i = 0; i< paintList.size(); i++) {
                Shape s = paintList.get(i);
                s.setScale(this.getWidth()/defaultWidth, this.getHeight()/defaultHeight);
                s.paintComponent(g);
            }
   }
}

Как сделать правильный масштабный трюк?Где я должен умножить значения, чтобы все работало хорошо?

1 Ответ

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

Прежде всего, вы не должны добавлять свой JPanel в свое окно, а должны установить его как ContentPane: setContentPane(new DrawShape());. Далее, вы не должны перекрашивать внутри цикла, но снаружи (в конце вашего метода paintComponent(Graphics g), например). Таким образом, JPanel должен быть снова нарисован постоянно. Если вам нужно изменить размер вашей фигуры в зависимости от размера окна, сделайте это в вашем методе JPanel paintComponent(Graphics g):

//fill it with the shapes base sizes (index 0 = width, index 1 = height)
Map<Shape,int[]> shapeSizes = new HashMap<Shape,int[]>();
public void paintComponent(Graphics g) {
double widthCoeff = this.getWidth()/(double)Window.this.defaultWidth;
double heightCoeff = this.getHeight()/(double)Window.this.defaultHeight;
for (int i = 0; i< paintList.size(); i++) {
Shape s = paintList.get(i);
int[] baseSize = shapeSizes.get(s);
int oldWidth = baseSize[0], oldHeight = baseSize[1];
int width = oldWidth*widthCoeff, height = oldHeight*heightCoeff;
//you can now give the shape its new width and height
}
}
...