2
我在NetBeans中有一個項目,它使用分層窗格通過在必要時進行切換來顯示重疊面板。在啓動時,程序將顯示在面板上(在單獨的線程中運行)中的一個的介紹動畫,通過以下實現:Java JLayeredPane內容在刷新時閃爍
public class IntroPanel extends javax.swing.JPanel implements Runnable {
private boolean finished;
private int opacity;
private JLabel[] labels = new JLabel[3];
public IntroPanel() {
initComponents();
labels[0] = jLabel1;
labels[1] = jLabel2;
labels[2] = jLabel3;
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
for(JLabel label : labels)
label.setForeground(new Color(200,200,200,opacity));
}
@Override
public void run(){
while (!finished) {
while (opacity < 255) {
try {
Thread.sleep(30);
opacity += 5;
repaint();
} catch (InterruptedException ex) {
Logger.getLogger(IntroPanel.class.getName()).log(Level.SEVERE, null, ex);
}
}
try {
repaint();
Thread.sleep(3000);
} catch (InterruptedException ex) {
Logger.getLogger(IntroPanel.class.getName()).log(Level.SEVERE, null, ex);
}
while (opacity > 0) {
try {
Thread.sleep(30);
opacity -= 5;
repaint();
} catch (InterruptedException ex) {
Logger.getLogger(IntroPanel.class.getName()).log(Level.SEVERE, null, ex);
}
}
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {
Logger.getLogger(IntroPanel.class.getName()).log(Level.SEVERE, null, ex);
}
finished = true;
}
}
的預期效果是具有三個的JLabel淡入,留在屏幕上的然後淡出。前兩個標籤包含斜體大小的字體,第三個包含小字體。這裏的問題:
- 前兩個標籤的文本在淡入或淡出時顯示爲非斜體,只是在標籤不衰落時暫時變爲斜體。
- 第三個標籤(小號,非斜體)完全不褪色,而是在重新繪製循環期間快速上下晃動。
我瞭解它是如何的一個更好的想法寫我自己積極的渲染方法,而不是使用的paintComponent(),但有以下替換的paintComponent():
public void render() {
Graphics g = getGraphics();
for(JLabel label : labels)
label.setForeground(new Color(200,200,200,opacity));
g.dispose();
}
做同樣閃爍。我在這裏丟失了什麼東西,或者打了重漆和分層框架,卻不混合?
1.這樣做,沒有效果。 2.如你所說,現在沒有任何重新粉刷,甚至沒有閃爍;它只是一個靜態圖像。 – amitakartok
D'oh ...我沒有把setForeground放到Timer的ActionListener中。消失的斜體問題仍然存在,但我發現問題的根源在於小文字:文本不會褪色,因爲它被封裝在自動換行的標籤中。我已經發現線程正在討論它,現在正在研究它。 – amitakartok
@amitakartok:你編譯並運行我的代碼? –