
Почему между синей и пурпурной панелями существует зазор?
Примечание. Когда magentaPanel.getY() == 600, тогда зазор между синей и пурпурной панелями исчезнет.
Код: Выделить всё
import javax.swing.*;
import java.awt.*;
public class TheFrame {
private JPanel bluePanel;
private JPanel magentaPanel;
public TheFrame() {
bluePanel = new JPanel();
bluePanel.setBounds(0, 0, 600, 600);
bluePanel.setBackground(Color.BLUE);
magentaPanel = new JPanel();
magentaPanel.setBounds(0, -600, 600, 600);
magentaPanel.setBackground(Color.MAGENTA);
JPanel panelContainer = new JPanel();
panelContainer.setPreferredSize(new Dimension(600, 600));
panelContainer.setLayout(null);
panelContainer.add(bluePanel);
panelContainer.add(magentaPanel);
JFrame frame = new JFrame();
frame.add(panelContainer);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
new Thread(() -> {
while (true) {
sleep(10);
SwingUtilities.invokeLater(() -> {
//update UI.
bluePanel.setLocation(0, bluePanel.getY() + 1);
magentaPanel.setLocation(0, magentaPanel.getY() + 1);
});
if (bluePanel.getY() == 600) {
SwingUtilities.invokeLater(() -> {
//update UI.
bluePanel.setLocation(0, -600);
});
}
if (magentaPanel.getY() == 600) {
SwingUtilities.invokeLater(() -> {
//update UI.
magentaPanel.setLocation(0, -600);
});
}
}
}).start();
}
private static void sleep(int delay) {
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new TheFrame();
});
}
}
Код: Выделить всё
new Thread(() -> {
while (true) {
sleep(3);
SwingUtilities.invokeLater(() -> {
//update UI.
bluePanel.setLocation(0, bluePanel.getY() + 1);
magentaPanel.setLocation(0, magentaPanel.getY() + 1);
if (bluePanel.getY() == 600) {
//update UI.
bluePanel.setLocation(0, -600);
}
if (magentaPanel.getY() == 600) {
//update UI.
magentaPanel.setLocation(0, -600);
}
});
}
}).start();
Почему исходный код не работает как положено, но измененная версия работает?
Подробнее здесь: https://stackoverflow.com/questions/784 ... nvokelater