Эксперимент с графическим интерфейсом Swing: проблема с пробелами в панелях с использованием SwingUtilities.invokeLater(JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Эксперимент с графическим интерфейсом Swing: проблема с пробелами в панелях с использованием SwingUtilities.invokeLater(

Сообщение Anonymous »

Я экспериментирую с SwingUtilities.invokeLater(). Когда я запускаю код, и синяя, и пурпурная панели работают так, как ожидалось, перемещаясь вниз на 1 пиксель каждые 10 мс, НО, когда bluePanel.getY() == 600, программа отображает разрыв между синей и пурпурной панелями:
Изображение

Почему между синей и пурпурной панелями существует зазор?
Примечание. Когда 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();

});

}
}

Когда я изменил метод run(), который анонимный поток выполняет следующим образом:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»