Java GUI проблема с изменением размера - PullRequest
0 голосов
/ 26 мая 2020

Я никогда не создавал GUI с изменяемым размером. Я всегда использовал " JFrame.resizeable (false) ".

Однако на этот раз я хотел попробовать манипуляции с пикселями с помощью BufferedImage. Я хотел изменить размер изображения и посмотреть, как реагируют пиксели. Однако это не go, как ожидалось. Анимация просто остановилась и не растягивает окно как надо?

См. Это GIF .

В моем проекте есть два класса. Один из них - таймер, поэтому я могу обновлять его каждые 1/60 секунды. Другой - просто окно. Они называются «Обновление» и «Окно» .

Код обновления:

if(render) {    //Render
            frames++;
            window.clear();

            render = false;
        }

Код окна:

public class Window extends Canvas {

//Variabler
private static final long serialVersionUID = 1L;
int width = 1000;           //Gör så den kan resiza.. pls
int height = 1000;          //Gör så den kan resiza.. pls
int i = 0;
private JFrame window;
private BufferStrategy bs;
private Graphics g;
private BufferedImage image;
//----


public Window() {

    window = new JFrame();

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    window.add(this,BorderLayout.CENTER);
    window.setResizable(true);
    window.setLocationRelativeTo(null); //Sätter den i mitten.
    window.getPreferredSize();  //Set preferred size
    window.pack();  //Set size for real




    //Bufferstrategy
    this.createBufferStrategy(2);   
    bs = this.getBufferStrategy();

    g = bs.getDrawGraphics();


    window.setVisible(true);    //Visa window



}
@Override
public Dimension getPreferredSize() {   
    return new Dimension(width,height);


}

public void clear() {   
    image = new BufferedImage(window.getWidth(),window.getHeight(),BufferedImage.TYPE_INT_RGB); 
    int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();   


        for(int x = 0; x < pixels.length; x++) {
            pixels[x] = i++;        //Makes an effect

        }


        g.drawImage(image, 0, 0, window.getWidth(), window.getHeight(), null);



    bs.show();
}
}

Интересно, а почему это так? Что не так с моим кодом? Если это уже было опубликовано (я не нашел аналогичного сообщения), не стесняйтесь отправить меня в это сообщение :)

Спасибо!

EDIT

MRE:

В l oop он отображает каждую 1/60 секунды и запускает этот код:

if(render) {    //Render
        frames++;
        window.clear();

        render = false;
    }

Окно. Функция clear () находится в другом классе:

public void clear() {   
image = new BufferedImage(window.getWidth(),window.getHeight(),BufferedImage.TYPE_INT_RGB); 
int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();   


    for(int x = 0; x < pixels.length; x++) {
        pixels[x] = i++;        //Makes an effect

    }


    g.drawImage(image, 0, 0, window.getWidth(), window.getHeight(), null);



bs.show();
}

Этот метод используется для очистки экрана, однако на данный момент я использую его как анимацию. Я делаю это, добавляя 1 к переменной i (мое значение цвета int). Для очистки оптимально 0.

...