![](/img/trans.png)
[英]JPanel revalidate and repaint not working properly (Java Swing)
[英]Java usage of revalidate() and repaint() not properly working
因此,我嘗試創建一個框架來執行Diashow,但是由於某種原因,我只能看到一個空框架,完成所有操作后,我可以看到最后一張圖片。 我想看的是每張照片之間有〜1秒的暫停時間。 我以我認為它起作用的方式使用了revalidate()/ repaint(),但是我很確定問題出在這里,因為我想不出另一個原因。
我只是開始學習Java.Swing,因此,歡迎您輸入任何信息來提高自己的技能。 正如我已經說過的那樣,我認為問題出在我對revalidate()的使用上,但是我無法單獨使用Google來解決它。
作為類的輸入,我使用BufferedImage數組,我想為其創建diashow。
我還嘗試將圖像直接放在我的Container c上,而不是放在JPanel p上 ,但是無論按照我希望的方式,它都能起作用。
public class DiashowFrame extends JFrame {
Container c;
JPanel p;
public DiashowFrame(JFrame father,BufferedImage [] image) {
c= getContentPane();
c.setLayout(new FlowLayout());
p = new JPanel();
p.setLayout(new FlowLayout());
p.setSize(500,500);
c.add(p);
setSize(500,500);
setLocation(father.getX(),father.getY());
setVisible(true);
dia(p,image);
}
public static void dia(JPanel p,BufferedImage[] image) {
JLabel def= new JLabel(new ImageIcon(image[0]));
p.add(def);
//c.repaint();
p.revalidate();
for(int x=1;x<image.length;x++) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//p.removeAll();
//p.revalidate();
Image imager = image[x].getScaledInstance(500, 500, 100);
def = new JLabel(new ImageIcon(imager));
p.add(def);
p.revalidate();
//p.repaint();
}
}
}
與大多數GUI框架一樣,Swing是單線程的,並且不是線程安全的。
這意味着從事件調度線程中執行的任何長時間運行或阻止的操作都將阻止EDT處理事件隊列並以任何方式更新UI。
盡管您可以使用Thread
將等待時間轉移到第二個線程,但Swing並不是線程安全的,這意味着您切勿直接或間接在EDT上下文之外更新/修改UI。
在這種情況下,最簡單的解決方案是僅使用Swing Timer
。 這使您可以指定兩次更新之間的延遲(以及是否重復),該延遲是在EDT上執行的,但是在觸發時會在EDT的上下文中得到通知,從而使Swing易於安全使用。
Timer
充當偽循環, Timer
每個觸發器代表下一次迭代
有關更多詳細信息,請參見如何使用Swing計時器 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.