В коротком методе я скрываю JFrame, используя setVisible (false).
Затем я делаю скриншот и восстанавливаю JFrame с помощью setVisible (true).
После того, как окно снова станет видимым, предполагается, что окно будет отображать другое изображение, чем раньше (скажем, часть этого снимка экрана сделана).
Проблема в том, что после вызова setVisible (true) окно мигает со старым содержимым за доли секунды до вызова paintComponent и отображается обновленное состояние.
Возможно, я мог бы обойти это безобразно, но я хотел знать, есть ли лучшие решения.
Заранее спасибо за любую помощь
edit: При подготовке примера я заметил, что эффект почти не наблюдается, когда не используется прозрачность, как в моей программе. Наверное, следовало упомянуть об этом. Вот что я придумал:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.sun.awt.AWTUtilities;
public class Test {
static boolean flag = false;
static Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame();
frame.setUndecorated(true);
AWTUtilities.setWindowOpaque(frame, false); //draw on a transparent window
frame.setSize(scrSize.width, scrSize.height);
frame.setContentPane(new JPanel() {
protected void paintComponent(Graphics g)
{
if (Test.flag) {
g.setColor(Color.RED);
g.drawRect(50, 50, scrSize.width - 100, scrSize.height - 100);
}
else {
g.setColor(Color.GREEN);
g.fillOval(50, 50, scrSize.width - 100, scrSize.height - 100);
}
}
});
frame.setVisible(true); //green oval shown
Thread.sleep(1000);
frame.setVisible(false);
flag = true; // next draw produces red rectangle
Thread.sleep(1000);
frame.setVisible(true); // before the next draw,
// you can see a flash of the green oval
}
}