Я заканчиваю свою домашнюю работу на ООП 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);
}
}