繁体   English   中英

如何使特定标签在JList中闪烁

[英]How to make a particular label blink in JList

我已经设法使用panel作为JList的单元格渲染组件。 并且面板中包含的闪烁标签本身就可以正常工作。 但是当我在渲染到列表后,标签停止闪烁。

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

我的问题在于两层:

  1. 为什么自包含blink-label-prove面板需要刷新JList以查看闪烁?
  2. 为什么特殊标签在渲染过程中没有被挑出来导致列表中的所有标签唱歌和跳舞?

这个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();
         }
      });
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM