Кажется, я не могу заставить макет в Swing. У меня есть JComponent
, добавленный к JLayeredPane
, и я установил границу на JComponent
. Затем я хочу сразу все перерисовать — не в смысле «пожалуйста, сделайте это как можно скорее», как invalidate()
, а синхронно и немедленно. Любая помощь? Кажется, я не могу найти правильный способ сделать это, и все, что я читал о invalidate(), validate(), repaint(), doLayout(), etc
, только еще больше сбивает меня с толку!
Принудительное немедленное размещение и рисование в Swing
Ответы (3)
Согласно этому (см. раздел "Синхронное рисование") метод paintImmediately() должен работать.
Самый надежный способ заставить Swing обновить отображение — использовать SwingUtilities.invokeLater
. В вашем случае это будет выглядеть примерно так
SwingUtilities.invokeLater(new Runnable {
public void run() {
somecomponent.repaint();
}
});
Я понимаю, что «invokelater» не совсем звучит так, как будто он делает что-то немедленно, но на практике события, опубликованные таким образом, имеют тенденцию выполняться довольно быстро по сравнению с простым вызовом, например. somecomponent.repaint()
напрямую. Если вам абсолютно необходимо, чтобы ваш управляющий код ждал обновления графического интерфейса, то есть также invokeAndWait
, но, по моему опыту, в этом редко возникает необходимость.
См. также: документ об отправке событий в Swing. .
Это очень старое, но я нашел простое решение, которое я покажу с помощью JPasswordField:
var pw = new JPasswordField();
...
pw.paint(pw.getGraphics()); // paints immediately