Я пытаюсь создать простую анимацию, в которой прямоугольник начинается с экрана (справа от правого края экрана) и перемещается влево. Таким образом, в этом случае мой кадр имеет ширину 1000, а стена начинается с значения х 1100. Очевидно, что сначала прямоугольник не должен отображаться . Но по мере того, как прямоугольник перемещается влево, он должен стать видимым. Однако эта анимация этого не делает. Даже когда x-значение стены находится в пределах экрана, оно не отображается.JComponent перестает получать визуализацию, когда она уходит с экрана
Я пытался ставить println()
заявление в paintComponent()
методе стены, и я обнаружил, что paintComponent()
не вызывался по методу repaint()
кадра. Я подумал, что когда стена была впервые добавлена в рамку, Swing решил, что, поскольку она была на экране, ее не нужно отображать, и поэтому даже когда стена в конечном итоге попадает на экран, Swing считает, что она не нужна для рендеринга.
Я пробовал проверять и аннулировать рамку и компонент, но ничего не сработало. Пожалуйста, помогите мне исправить это. Ниже приведен код:
package graphics.simpleAnimation;
public class Simple_Animation implements Runnable {
private UI ui; // The UI (frame)
private Wall wall; // Wall object that moves across the screen
private Simple_Animation() {
// Initialize the wall object (intentionally given an x value that is greater than the frame's width)
wall = new Wall(1100, 400, 200, 400);
// Initialize the UI (width is only 1000)
ui = new UI(1000, 600, "Geometry Dash");
// Add the wall to the ui (the frame)
ui.add(wall);
}
public void run() {
// Set the frame visible
ui.setVisible(true);
// Repaint the frame and move the wall
while (true) {
ui.repaint();
wall.moveWall(-2, 0);
try {
Thread.sleep(16);
} catch (InterruptedException IE) {
System.out.println(IE);
}
}
}
// Starts the program in a new thread
public static void main(String[] args) {
Simple_Animation simpleAnimation = new Simple_Animation();
new Thread(simpleAnimation).start();
}
}
package graphics.simpleAnimation;
import javax.swing.*;
import java.awt.*;
public class UI extends JFrame {
// Variables storing the width and height of the content pane (where the components are being rendered)
public int content_pane_width;
public int content_pane_height;
public UI(int frameW, int frameH, String frameTitle) {
setTitle(frameTitle);
setSize(frameW, frameH);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(null);
content_pane_width = getContentPane().getWidth();
content_pane_height = getContentPane().getHeight();
}
@Override
public void paint(Graphics g) {
super.paint(g);
}
}
package graphics.simpleAnimation;
import java.awt.*;
import javax.swing.*;
public class Wall extends JComponent {
private int wallX;
private int wallY;
private int wallW;
private int wallH;
Wall(int x, int y, int sizeX, int sizeY) {
wallX = x;
wallY = y;
wallW = sizeX;
wallH = sizeY;
setSize(getPreferredSize());
}
public void moveWall(int moveX, int moveY) {
wallX += moveX;
wallY += moveY;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(wallW, wallH);
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
setLocation(wallX, wallY);
g2d.fillRect(0, 0, wallW, wallH);
}
}
Не делайте 'setLocation (wallX, wallY);' внутри метода рисования, рисование должно рисовать текущее состояние, которое никогда не меняет его. Вы также смешиваете свои собственные свойства с свойствами компонентов, я бы предложил просто использовать ранее существовавшие компоненты, поскольку вы пытаетесь сами поместить/размер компонента. Кроме того, 'getPreferredSize' ничего не сделает, если вы используете макет« null », что, вероятно, объясняет часть вашей проблемы. – MadProgrammer
См. [Обнаружение/исправление для висящей скобки блока кода] (http: // meta .stackexchange.com/q/251795/155831) для проблемы я больше не мог беспокоить исправление. –