1

我已经设法将面板用作JList. 面板中包含的闪烁标签本身就可以正常工作。但是在我将渲染添加到列表后,标签停止闪烁。

我通过以一定间隔刷新列表来解决问题,以便能够看到闪烁,但是这次列表中的所有标签都开始闪烁(我只希望列表中的某些标签满足条件闪烁)。我已经研究了好几个小时试图解决它,但机会看起来很渺茫。

我的问题分为两层:

  1. 为什么自带的blink-label-prove面板需要JList刷新才能查看blink?
  2. 为什么在渲染过程中没有单独选择特定标签导致列表中的所有标签都在唱歌和跳舞?
4

1 回答 1

4

这个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();
         }
      });
   }
}
于 2012-05-19T23:07:21.693 回答