Я никогда не создавал 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.