Ранши

ответов0 / помог0

Swing, awt, добавление картинки на jframe

1680041822
Добрый день. Существует фрэйм, на который я рисую маленькие картинки. Каждая из них - фрагмент одной большой. Как пазл, знаете?) Так вот.. Проблема в том, что при добавлении каждого нового фрагмента, приходится перерисовывать весь фон - все старые, уже нарисованные фрагменты. Я помещал их в лист и перерисовывал при добавлении новой. Когда их 3, 5, еще куда ни шло, а когда их десятки и даже сотни - это уже по моему не правильно. Подскажите пожалуйста, как мне это реализовать более правильно? Ну там, например, считать уже имеющийся фон (нарисованные фрагменты) одной большой картинкой и рисовать ее как единое целое, а не как совокупность маленьких объектов. Не знаю. гуглил на эту тему, но все как то не то...

import javax.swing.*;
import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.*;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
 
public class Main extends JComponent implements Runnable {
 
 
    private static JFrame frame;
    private Image source;
   // private final Image source = new ImageIcon("d:\\source.png").getImage();
    private int imageWight;
    private int imageHeight;
    private List<MySprite> imageSprite = new CopyOnWriteArrayList<>();
    private List<MySprite> temp = new CopyOnWriteArrayList<>();
    private AtomicInteger position = new AtomicInteger();
    private MySprite sprite;
 
 
 
    public Main() {
        position.set(0);
 
        loadImageFromNet("https://3d-linker.ru/components/com_jshopping/files/img_products/full_2049.jpg");
 
        int col = imageWight / 50;
        int frame_side = 50;
        if (imageHeight > imageWight) {
            System.out.println("2");
            col = col + 1;
        }
 
        int frame = 0;
        int pos_x = 0;
        int pos_y = 0;
 
        System.out.println(imageWight / 50);
        int name = 0;
 
        while (pos_y < imageHeight){
            temp.add( new MySprite(String.valueOf(name++), source, pos_x, pos_y, col, frame, frame_side, frame_side) );
            frame ++;
            pos_x += frame_side;
 
            if (pos_x >= imageWight){
                pos_x = 0;
                pos_y += frame_side;
            }
        }
 
       Collections.shuffle(temp);
    }
 
 
    private void loadImageFromNet(String url){
        try {
            URL website = new URL(url);
            ReadableByteChannel rbc = Channels.newChannel(website.openStream());
 
            FileOutputStream fos = new FileOutputStream("source.jpg");
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
 
            source = new ImageIcon("source.jpg").getImage();
            imageWight = source.getWidth(null);
            imageHeight = source.getHeight(null);
 
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
 
 
 
    @Override
    public void run() {
        while (true) {
            int x = new Random().nextInt(2000);
            try {
                Thread.sleep(x);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
 
            if (position.get() < temp.size()) {
                imageSprite.add( temp.get(position.getAndIncrement()));
                frame.repaint(0, 0, 0, frame.getWidth(), frame.getHeight());
                
            } else {
                break;
            }
        }
    }
 
    void drawSpriteFrame(Image source, Graphics2D g2d, int x, int y, int columns, int frame, int width, int height) {
        int frameX = (frame % columns) * width;
        int frameY = (frame / columns) * height;
 
        g2d.drawImage(source, x, y,
                x+width, y+height,
                frameX, frameY,
                frameX+width, frameY+height, this);
    }
 
    @Override
    public void paintComponent(Graphics g) {
 
    }
 
 
    @Override
    public void paint(Graphics g) {
        Graphics2D graphics = (Graphics2D)g;
 
        if (imageSprite.size() > 0) {
 
            for (MySprite sprite : imageSprite) {
              // System.out.println(sprite.getFrameName());
               drawSpriteFrame(
                        sprite.getImage(), graphics,
                        sprite.getPosX(), sprite.getPosY(),
                        sprite.getColumn(), sprite.getFrame(),
                        sprite.getSpriteWidth(), sprite.getSpriteHeight()
                );
            }
        }
    }
 
 
    public static void main(String[] args) {
        Main main = new Main();
        frame = new JFrame("test");
        frame.setLocation(500, 300);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(main);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.repaint(0, 0, 0, frame.getWidth(), frame.getHeight());
        frame.setSize(main.source.getWidth(main), main.source.getHeight(main));
 
        for (int i = 0; i < 15; i++) {
            new Thread(main).start();
        }
    }
 
}
 
------------------------------------------------------------------------------
 
public class MySprite {
 
    private String frameName;
    private Image image;
    private int posX;
    private int posY;
 
    private int column;
    private int frame;
 
    private int spriteWidth;
    private int spriteHeight;
.......
}
coffeini
ответов1 / помог1
1680042035
Если я правильно понял, то у тебя класс спрайта хранит маленькие изображения. Тогда почему бы не сделать их компонентом свинга и перенести логику отрисовки спрайта в их класс. Потом уже абстрагируясь от этого, добавить их в панель, которая является уже большим изображением. И соответственно менять каждому спрайту видимость, когда нужно показать: c невидимого на видимый.
Раншивлепить жирный лайк
Ранши
ответов0 / помог0
1680042108
coffeini, спасибо)
влепить жирный лайк
Сначала вход
A B i U S JS PHP HTML CSS SQL C C++ C# PYTHON JAVA
Для входа только имэйл или имя и апроль
Можно сменить аватар
Имэйл Ваше имя
Пароль