У меня есть проект в 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;
}
}
планируемый эффект должен иметь три JLabels выгорает, остаются на экране для момент исчезает. Первые два ярлыка содержат курсивный текст с большим размером шрифта, третий содержит мелкий шрифт. Здесь вы найдете следующие вопросы:
- Текст первых двух ярлыков отображается не курсивом, в то время как затухание или выпадение происходит, только кратковременно становясь курсивом, в то время как метки не затухают.
- Третья этикетка (мелкая печать, не-курсивная) не исчезает вообще, а «быстро встряхивается» вверх и вниз во время перерисовывающих петель.
Я читал о том, как это лучше идея написать свой собственный активный метод рендеринга вместо использования 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 в ActionListener Timer. Исчезающая проблема с курсивом по-прежнему сохраняется, но я нашел источник проблемы с мелким шрифтом: текст не исчезает, потому что он заключен в теги для автоматического переноса слов. Я уже нашел поток, рассказывающий об этом, изучая его сейчас. – amitakartok
@amitakartok: вы скомпилировали и запустили мой код? –