2012-05-19 32 views
1

我已經成功地使用面板作爲一個單元渲染組件的JList。包含在面板中的眨眼標籤本身就可以正常工作。但是在我將重新渲染到列表中後,標籤停止閃爍。如何使一個特定的標籤中閃爍的JList

我工作圍繞通過刷新列表以一定的時間間隔,以能看到閃爍,然而這一次在列表中的所有標籤開始閃爍(我只希望某些標籤列表中的眨眼滿足條件)。我已經鑽研了幾個小時試圖解決它,但機會看起來很暗淡。

我的問題在於2層:

  1. 爲什麼自足眨眼標籤,證明面板需要JList刷新查看眨眼?
  2. 爲什麼特定的標籤不渲染導致所有的標籤列表中的載歌載舞中單挑?
+1

想你一定知道該渲染器充當橡皮圖章顯示一個JLabel的圖像,但真的不是*的*的JLabel,而通常這是問題的根源。這就是說,很難說沒有代碼的情況下你做錯了什麼。考慮創建一個小型可編譯的可運行程序,我們可以運行,測試和修改,並顯示您的問題,[sscce](http://sscce.org)。 –

+0

上述標籤是該渲染面板單元格中的子組件。因此,如果個別案件工作(即標籤將閃爍,如果滿足一定條件),爲什麼它會需要列表刷新才能看到效果,因爲所有的這些都應該渲染(getListCellRendererComponent)期間進行大修。代碼片段的這一部分看起來像這樣: – Saint

+0

請查看我的代碼發佈作爲答案,以查看示例SSCCE,以及​​在JList中閃爍標籤的方式。 –

回答

3

SSCCE作品對我來說:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class BlinkingLabelInList extends JPanel { 
    public static final Color FLASH_COLOR = Color.red; 
    public static final int TIMER_DELAY = 500; 
    private String[] data = {"Mon", "Tues", "Wed", "Thurs", "Fri"}; 
    private JList list = new JList(data); 
    public Color cellColor = null; 


    public BlinkingLabelInList() { 
     add(new JScrollPane(list)); 
     list.setCellRenderer(new MyListCellRenderer()); 
     new Timer(TIMER_DELAY, new TimerListener()).start(); 
    } 

    private class TimerListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     cellColor = (cellColor == null) ? FLASH_COLOR : null; 
     list.repaint(); 
     } 
    } 

    private class MyListCellRenderer extends DefaultListCellRenderer { 
     @Override 
     public Component getListCellRendererComponent(JList list, 
      Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     Component cellRenderer = super.getListCellRendererComponent(list, value, index, isSelected, 
       cellHasFocus); 
     if (isSelected || cellHasFocus) { 
      cellRenderer.setForeground(cellColor); 
     } else { 
      cellRenderer.setForeground(null); 
     } 
     return cellRenderer; 
     } 

    } 

    private static void createAndShowGui() { 
     BlinkingLabelInList mainPanel = new BlinkingLabelInList(); 

     JFrame frame = new JFrame("BlinkingLabelInList"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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