1

のセル レンダリング コンポーネントとして panel を使用することができましたJList。また、パネルに含まれる点滅ラベルは、それ自体で正常に機能します。しかし、レンダーをリストにぶつけた後、ラベルの点滅が止まりました。

一定の間隔でリストを更新して点滅を確認することで回避しましたが、今回はリスト内のすべてのラベルが点滅し始めます(リストの点滅で特定のラベルが条件を満たしただけでした)。私はそれを何時間も掘り下げて解決しようとしましたが、チャンスは薄暗いようです.

私の質問は2つの層にあります:

  1. 自己完結型の瞬きラベル証明パネルJListを更新して瞬きを表示する必要があるのはなぜですか?
  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 に答える