Как правильно «наложить» изображения (и изменить источник) без наследования от Swing - PullRequest
0 голосов
/ 01 апреля 2019

Я заканчиваю свою домашнюю работу на ООП Java.Назначение состоит в том, чтобы загрузить изображения в JFrame, иметь возможность перемещать их вокруг (верхний слой должен иметь приоритет, в настоящее время это не так) и нажимать на них, чтобы "перевернуть их" (изменитьисточник изображения по существу).В настоящее время у меня возникают проблемы с поиском решения о том, как правильно «наложить» изображения, видимые на экране, и расставить приоритеты для изображений сверху вверх (в настоящее время расставляются приоритеты для нижних).

Я такжевозникли проблемы с поиском хорошего способа изменить источник изображений, поскольку наш учитель запретил расширение класса Picture с помощью Swing.

Моя первая попытка решить эту проблему состояла в сохранении информации о каждом отдельном объекте «Picture» вArrayList.Это работает, чтобы сохранить положение изображений, но не решает мою проблему с наложением слоев.Я также хотел использовать JLayeredPane, но, как я выяснил, это было сложнее, чем я думал, так как мне еще не удалось найти жизнеспособное решение таким образом (возможно, мне не хватает некоторых очевидных фактов о том, как оно работает).

IЯ думаю, что, вероятно, должно произойти, это то, что я сохраняю «положение» каждого изображения в некотором типе массива, а затем использую этот массив для распечатки изображений через paintComponent @ ImagePanel.Это то, чем я сейчас занимаюсь, но это не так, как я хочу.Я думаю, что мой способ загрузки изображений в классе «Picture» может иметь к этому отношение.У меня нет большого опыта работы с Java, поэтому все это ново для меня.

Я не хочу распечатывать все свои коды, так как у меня есть 4 класса, поэтому я собираюсьраспечатать то, что я чувствую, являются основными методами в каждом классе.Если вам чего-то не хватает, ребята, вам нужно, чтобы направить меня в правильном направлении, я предоставлю это также.

draw @ Picture

public void draw(Graphics g, int i) {
        try {
            BufferedImage img = ImageIO.read(new File("images/icon_"+ i +".gif"));
            g.drawImage(img, x, y, null);
        } catch(IOException ie) {
            System.out.println("Could not find images");
        }
    }

mousePressed & mouseDragged @ MouseHandler

public void mousePressed (MouseEvent e) {
        Point point = e.getPoint();

        chosen = imagepanel.locateImage(point);
    }

    public void mouseDragged (MouseEvent e) {
        int x = e.getX();
        int y = e.getY();

        if (chosen != null) {
            imagepanel.moveImage(chosen, x, y);
        }
    }

loadImages & paintComponent @ ImagePanel

private final static int IMAGES = 7;
private ArrayList <Picture> imageCollection = new ArrayList<>();
private Picture im;
Random rand = new Random();

public void loadImages() {
        for(int i=0; i<IMAGES; i++) {
            int x = rand.nextInt(400) + 40;
            int y = rand.nextInt(400) + 60;

            im = new Picture(x,y);

            imageCollection.add(im);
        }
    }

@Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int i = 0;

        for (Picture im : imageCollection) {
            i++;
            im.draw(g, i);
        }
    }

Я ожидаю, что изображения будут накладываться друг на друга в любое время "перевернул "(нажал) или переехал (перетащил).В настоящее время они этого не делают, поскольку они просто поддерживают свою «глубинную» позицию.Я попытался реализовать Image [] безуспешно.

У меня также есть метод переворота, при котором я пытался использовать setIcon (ранее я использовал ImageIcon вместо Image), но по какой-то причине это не сработало.

Мне также хотелось бы получить какие-либо отзывы о коде и любые улучшения, которые можно внести, как я всегда хочу улучшить.

РЕДАКТИРОВАТЬ: Однако мне удается решить свои проблемыЯ уверен, что есть лучший способ сделать это.

    public void placeFirst(Picture im) {
        int pos = imageCollection.indexOf(im);
        imageCollection.remove(pos);
        imageCollection.add(0, im);
    }

    public void flipImage(Picture im) {
        im.flip();
        placeFirst(im);
        repaint();
    }

    public void moveImage(Picture im, Point point) {
        im.move(point.x-(im.getWidth(im)/2), point.y-(im.getHeight(im)/2));
        placeFirst(im);
        repaint();
    }

    public Picture locateImage(Point point) {
        for (int i=0; i<imageCollection.size(); i++) {
            Picture im = imageCollection.get(i);

            if (im.fits(point)) {
                return im;
            }
        }
        return null;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // There probably exists a better and visually nicer way of doing this
        for (int i=imageCollection.size()-1; i>=0; i--) {
            Picture im = imageCollection.get(i);
            im.draw(g);
        }
    }

1 Ответ

1 голос
/ 01 апреля 2019
chosen = imagepanel.locateImage(point);

Ну, мы не знаем, как работает метод locateImage (...), но я думаю, что вы просто перебираете массив, пока не найдете совпадение.

Так что вы всегда будетенайдите такое же совпадение.

Поэтому, если вы хотите, чтобы изображение располагалось сверху, у вас есть две проблемы:

  1. , вам нужно изменить порядок поиска, чтобы при нажатиина изображении вы перемещаете его в позицию 0 в ArrayList, чтобы он всегда находился первым

  2. , но знаете, что когда вы рисуете изображения, вам нужно рисовать изображения от конца ArrayList до началатаким образом, первое изображение в ArrayList будет нарисовано последним.

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