2014-01-11 5 views
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; 
    } 
} 

планируемый эффект должен иметь три JLabels выгорает, остаются на экране для момент исчезает. Первые два ярлыка содержат курсивный текст с большим размером шрифта, третий содержит мелкий шрифт. Здесь вы найдете следующие вопросы:

  1. Текст первых двух ярлыков отображается не курсивом, в то время как затухание или выпадение происходит, только кратковременно становясь курсивом, в то время как метки не затухают.
  2. Третья этикетка (мелкая печать, не-курсивная) не исчезает вообще, а «быстро встряхивается» вверх и вниз во время перерисовывающих петель.

Я читал о том, как это лучше идея написать свой собственный активный метод рендеринга вместо использования paintComponent(), но заменяя paintComponent() следующим:

public void render() { 
    Graphics g = getGraphics(); 
    for(JLabel label : labels) 
     label.setForeground(new Color(200,200,200,opacity)); 
    g.dispose(); 
} 

делает то же мерцание. Я что-то пропущу здесь или зацикливал реплики, а слоистые рамки просто не смешиваются?

ответ

1
  1. Вы не должны делать ни одного кода в свой paintComponent внутри этого метода. Это должно быть в другом регионе вашей программы. paintComponent предназначен только для рисования, а не для установки состояния.
  2. Ваши циклы while должны быть заменены качающимся таймером, и здесь должны идти вызовы setForground.
  3. Вы должны опубликовать минимальный, complete valid, example, a small program, который мы можем скомпилировать, выполнить и протестировать. Ваш код этого не позволяет.

Например:

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

public class IntroPanel extends JPanel { 
    private static final int DELAY_TIME = 5; 
    protected static final Color FG_COLOR = Color.blue; 
    private List<JLabel> labelList = new ArrayList<JLabel>(); 
    private List<Color> colorList = new ArrayList<>(); 

    public IntroPanel() { 
     for (int i = 0; i < 255; i++) { 
     colorList.add(new Color(0, 0, 255, i)); 
     } 
     for (int i = 0; i < 255; i++) { 
     colorList.add(new Color(0, 0, 255, 255 - i)); 
     } 

     setLayout(new GridLayout(0, 1)); 

     JLabel label1 = new JLabel("Label 1"); 
     label1.setFont(label1.getFont().deriveFont(Font.ITALIC, 24)); 
     add(label1); 
     labelList.add(label1); 
     JLabel label2 = new JLabel("Label 2"); 
     label2.setFont(label2.getFont().deriveFont(Font.ITALIC, 24)); 
     add(label2); 
     labelList.add(label2); 
     JLabel label3 = new JLabel("Label 3"); 
     label3.setFont(label3.getFont().deriveFont(Font.PLAIN, 10)); 
     add(label3); 
     labelList.add(label3); 

     new Timer(DELAY_TIME, new ActionListener() { 
     private int index = 0; 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      if (index < colorList.size()) { 
       for (JLabel label : labelList) { 
        label.setForeground(colorList.get(index)); 
       } 
       index++; 
      } else { 
       ((Timer)evt.getSource()).stop(); 
      } 
     } 
     }).start(); 
    } 

    private static void createAndShowGUI() { 
     IntroPanel paintEg = new IntroPanel(); 

     JFrame frame = new JFrame("IntroPanel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(paintEg); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
     }); 
    } 
} 
+0

1. Помог ли это, никакого эффекта. 2. Как вы сказали, теперь нет никакой перекраски, даже не мерцает; это просто статический образ. – amitakartok

+0

D'oh ... Я не помещал setForeground в ActionListener Timer. Исчезающая проблема с курсивом по-прежнему сохраняется, но я нашел источник проблемы с мелким шрифтом: текст не исчезает, потому что он заключен в теги для автоматического переноса слов. Я уже нашел поток, рассказывающий об этом, изучая его сейчас. – amitakartok

+0

@amitakartok: вы скомпилировали и запустили мой код? –

Смежные вопросы