Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据JList中的枚举设置不同的文本颜色?_Java_Swing_Enums_Jlist_Listcellrenderer - Fatal编程技术网

Java 如何根据JList中的枚举设置不同的文本颜色?

Java 如何根据JList中的枚举设置不同的文本颜色?,java,swing,enums,jlist,listcellrenderer,Java,Swing,Enums,Jlist,Listcellrenderer,编辑:以下是@HovercraftFullOfEels回答: 注意:我没有使用HashMap,因为我想做一些操作,比如更改颜色和使字体粗体或斜体,而答案中提供的HashMap只用于将特定颜色设置为特定的枚举类型 下面是代码: package src; import java.awt.Color; import java.awt.Component; import java.awt.EventQueue; import java.awt.Font; import javax.swing.Def

编辑:以下是@HovercraftFullOfEels回答:

注意:我没有使用HashMap,因为我想做一些操作,比如更改颜色和使字体粗体或斜体,而答案中提供的HashMap只用于将特定颜色设置为特定的枚举类型

下面是代码:

package src;

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;

import src.MainWindow.LogType;

public class MainWindow {

    public enum LogType {
        ERROR("Error"), COMMENT("Comment"), READ_INFO("Read_Info"), ACTION(
                "Action"), PARAM_ERROR("Param_Error");
        String text;

        private LogType(String s) {
            this.text = s;
        }

        public void setText(String s) {
            this.text = s;
        }

        public String getText() {
            return text;
        }
    };

    private JFrame frmNavdng;
    private static DefaultListModel<LogType> logListModel = new DefaultListModel<>();
    private static JList<LogType> log_List = new JList<>(logListModel);

    public MainWindow() {
        initialize();
    }

    public static void add_Log_Line(LogType type, String s) {
        // add action to the log list
        type.setText(s);
        logListModel.addElement(type);
        log_List.ensureIndexIsVisible(log_List.getLastVisibleIndex());
    }

    private void initialize() {
        /** Frame Initialisation */
        frmNavdng = new JFrame();
        frmNavdng.setFont(new Font("Tahoma", Font.PLAIN, 12));
        frmNavdng.setTitle("list_window");
        frmNavdng.setResizable(false);
        frmNavdng.setBounds(100, 100, 640, 400);
        frmNavdng.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmNavdng.getContentPane().setLayout(null);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(0, 0, frmNavdng.getWidth(), frmNavdng.getHeight());
        frmNavdng.getContentPane().add(scrollPane);
        scrollPane.setViewportView(log_List);
        log_List.setToolTipText("history of the last actions");
        log_List.setVisibleRowCount(10);
        log_List.setValueIsAdjusting(true);
        log_List.setFont(new Font("Tahoma", Font.PLAIN, 10));
        log_List.setCellRenderer(new MyCellRenderer());
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainWindow window = new MainWindow();
                    window.frmNavdng.setVisible(true);
                    for (int i = 0; i <= 5; i++) {
                        add_Log_Line(LogType.ACTION, ("loop " + i));
                    }
                } catch (Exception e) {
                    e.toString();
                }
            }
        });
    }

}

class MyCellRenderer extends DefaultListCellRenderer {

    private static final long serialVersionUID = 1L;

    public MyCellRenderer() {
        setOpaque(true);
    }

    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        LogType lt = (LogType) value;   

        value = lt.getText();

        Color background = Color.white;
        Color foreground = Color.black;
        Font font = list.getFont();

        if (lt == LogType.ACTION) {
            foreground = Color.blue;
        }

        if (lt == LogType.COMMENT) {
            foreground = Color.darkGray;
        }

        if (lt == LogType.ERROR) {
            foreground = Color.red;
            font = new Font(list.getFont().getFontName(), Font.BOLD, list
                .getFont().getSize());
        }

        if (lt == LogType.READ_INFO) {
            foreground = Color.magenta;
            font = new Font(list.getFont().getFontName(), Font.ITALIC, list.getFont().getSize());
        }

        if (lt == LogType.PARAM_ERROR) {
            foreground = Color.orange;
            font = new Font(list.getFont().getFontName(), Font.BOLD, list
                .getFont().getSize());
        }

        if (isSelected)
            background = Color.lightGray;

        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

        c.setForeground(foreground);
        c.setBackground(background);
        c.setFont(font);

        return c;
    }
}
}


我得到的只是一个黑白相间的列表…

根据我们的讨论,在渲染器中设置颜色,然后在那里设置文本。在这里,我更改了枚举,使其返回一个显示字符串,但HashMap也可以工作。我确实使用HashMap来存储所需的颜色:

import java.awt.Color;
import java.awt.Component;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;

@SuppressWarnings("serial")
public class MainWindow extends JPanel {
   private DefaultListModel<LogType> logListModel = new DefaultListModel<>();
   private JList<LogType> logList = new JList<>(logListModel);
   private Map<LogType, Color> logTypeColorMap = new HashMap<>();

   public MainWindow() {
      logList.setPrototypeCellValue(LogType.COMMENT); // longest one

      for (int i = 0; i < 30; i++) {
         int index = (int) (Math.random() * LogType.values().length);
         LogType logType = LogType.values()[index];// get a random LogType
         logListModel.addElement(logType);
      }

      logList.setVisibleRowCount(10);
      logList.setCellRenderer(new MyCellRenderer());

      add(new JScrollPane(logList));
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("MainWindow");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new MainWindow());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

enum LogType {
   ERROR("Error"), COMMENT("Comment"), READ_INFO("Read Info"), ACTION("Action"); 
   private String text;

   private LogType(String text) {
      this.text = text;
   }

   public String getText() {
      return text;
   }
};

@SuppressWarnings("serial")
class MyCellRenderer extends DefaultListCellRenderer {
   private Map<LogType, Color> logTypeColorMap = new HashMap<>();

   public MyCellRenderer() {
      logTypeColorMap.put(LogType.ACTION, Color.blue);
      logTypeColorMap.put(LogType.COMMENT, Color.darkGray);
      logTypeColorMap.put(LogType.ERROR, Color.red);
      logTypeColorMap.put(LogType.READ_INFO, Color.magenta);
   }

   @Override
   public Component getListCellRendererComponent(JList<?> list, Object value,
         int index, boolean isSelected, boolean cellHasFocus) {
      LogType logType = (LogType) value;
      Color color = logTypeColorMap.get(logType);
      value = logType.getText(); // extract text
      Component c =super.getListCellRendererComponent(list, value, index, isSelected,
            cellHasFocus);
      c.setForeground(color);
      return c;
   }
}
就我自己而言,我仍然喜欢映射压缩代码的方式,使其更易于调试和使用。例如,我会考虑这样做:

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.EnumMap;
import java.util.Map;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class MainWindow2 extends JPanel {
   private static final long serialVersionUID = 1L;
   private static final Font FONT = new Font(Font.DIALOG, Font.PLAIN, 12);
   private static DefaultListModel<LogType> logListModel = new DefaultListModel<>();
   private static JList<LogType> logList = new JList<>(logListModel);

   public MainWindow2() {
      Map<LogType, LogWrapper> wrapperMap = new EnumMap<>(LogType.class);
      wrapperMap.put(LogType.ACTION, new LogWrapper("Action", Font.PLAIN, Color.BLUE));
      wrapperMap.put(LogType.COMMENT, new LogWrapper("Comment", Font.PLAIN, Color.DARK_GRAY));
      wrapperMap.put(LogType.ERROR, new LogWrapper("Error", Font.BOLD, Color.RED));
      wrapperMap.put(LogType.READ_INFO, new LogWrapper("Read Info", Font.ITALIC, Color.MAGENTA));
      wrapperMap.put(LogType.PARAM_ERROR, new LogWrapper("Parameter Error", Font.BOLD, Color.ORANGE));

      for (int i = 0; i < LogType.values().length * 3; i++) {
         int index = i % LogType.values().length;
         logListModel.addElement(LogType.values()[index]);
      }

      logList.setToolTipText("history of the last actions");
      logList.setVisibleRowCount(10);
      logList.setValueIsAdjusting(true);
      logList.setFont(FONT);
      logList.setCellRenderer(new MyCellRenderer2(wrapperMap));

      JScrollPane scrollPane = new JScrollPane(logList);
      add(scrollPane);

      logList.addListSelectionListener(new ListSelectionListener() {

         @Override
         public void valueChanged(ListSelectionEvent e) {
            if (!e.getValueIsAdjusting()) {
               JList<LogType> list = (JList<LogType>) e.getSource();
               LogType selection = list.getSelectedValue();
               String message = String.format("Selected LogType: %s", selection);
               JOptionPane.showMessageDialog(MainWindow2.this, message);
            }
         }
      });

   }


   private static void createAndShowGui() {
      JFrame frame = new JFrame("MainWindow2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new MainWindow2());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

class MyCellRenderer2 extends DefaultListCellRenderer {
   private static final long serialVersionUID = 1L;
   private static final Color DEFAULT_BG = Color.WHITE;
   private static final Color SELECTED_BG = Color.LIGHT_GRAY;
   private Map<LogType, LogWrapper> wrapperMap;

   public MyCellRenderer2(Map<LogType, LogWrapper> wrapperMap) {
      setOpaque(true);
      this.wrapperMap = wrapperMap;
   }

   @Override
   public Component getListCellRendererComponent(JList<?> list, Object value,
         int index, boolean isSelected, boolean cellHasFocus) {
      LogType lt = (LogType) value;
      LogWrapper logWrapper = wrapperMap.get(lt);
      String text = logWrapper.getText();

      Color background = isSelected ? SELECTED_BG : DEFAULT_BG;
      Color foreground = logWrapper.getForeground();
      Font font = list.getFont().deriveFont(logWrapper.getFontStyle());

      Component c = super.getListCellRendererComponent(list, text, index,
            isSelected, cellHasFocus);

      c.setForeground(foreground);
      c.setBackground(background);
      c.setFont(font);

      return c;
   }
}

class LogWrapper {
   private String text;
   private int fontStyle;
   private Color foreground;

   public LogWrapper(String text, int fontStyle, Color foreground) {
      this.text = text;
      this.fontStyle = fontStyle;
      this.foreground = foreground;
   }

   public String getText() {
      return text;
   }

   public int getFontStyle() {
      return fontStyle;
   }

   public Color getForeground() {
      return foreground;
   }

}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Font;
导入java.util.EnumMap;
导入java.util.Map;
导入javax.swing.*;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
公共类MainWindow2扩展了JPanel{
私有静态最终长serialVersionUID=1L;
私有静态最终字体字体=新字体(Font.DIALOG,Font.PLAIN,12);
私有静态DefaultListModel logListModel=新DefaultListModel();
私有静态JList日志列表=新JList(logListModel);
公共主窗口2(){
Map wrapperMap=新的EnumMap(LogType.class);
wrapperMap.put(LogType.ACTION,新的LogWrapper(“ACTION”,Font.PLAIN,Color.BLUE));
wrapperMap.put(LogType.COMMENT,新的LogWrapper(“COMMENT”,Font.PLAIN,Color.深灰色));
wrapperMap.put(LogType.ERROR,新的LogWrapper(“ERROR”,Font.BOLD,Color.RED));
wrapperMap.put(LogType.READ_INFO,新LogWrapper(“READ INFO”,Font.ITALIC,Color.MAGENTA));
wrapperMap.put(LogType.PARAM_ERROR,新的LogWrapper(“参数错误”,Font.BOLD,Color.ORANGE));
对于(int i=0;i

如果您试图为JList中的每一行指定唯一的文本,则

  • 将JList的泛型类型及其模型设为包装器类
  • 更改包装以包含枚举
  • 为添加到列表中的每个项目创建一个唯一的包装器实例,其中一个具有唯一的文本字段值。如果您只想设置一次字体和颜色,那么复制构造函数可以很好地实现这一点 例如(代码示例3):

    导入java.awt.Color;
    导入java.awt.Component;
    导入java.awt.Font;
    导入java.util.EnumMap;
    导入java.util.Map;
    导入javax.swing.*;
    导入javax.swing.event.ListSelectionEvent;
    导入javax.swing.event.ListSelectionListener;
    公共类MainWindow3扩展了JPanel{
    私有静态最终长serialVersionUID=1L;
    私有静态最终字体字体=新字体(Font.DIALOG,Font.PLAIN,12);
    私有静态DefaultListModel logListModel=新DefaultListModel();
    私有静态JList日志列表=新JList(logListModel);
    公共主窗口3(){
    Map wrapperMap=新的EnumMap(LogType.class);
    
    import java.awt.Color;
    import java.awt.Component;
    import java.util.HashMap;
    import java.util.Map;
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class MainWindow extends JPanel {
       private DefaultListModel<LogType> logListModel = new DefaultListModel<>();
       private JList<LogType> logList = new JList<>(logListModel);
       private Map<LogType, Color> logTypeColorMap = new HashMap<>();
    
       public MainWindow() {
          logList.setPrototypeCellValue(LogType.COMMENT); // longest one
    
          for (int i = 0; i < 30; i++) {
             int index = (int) (Math.random() * LogType.values().length);
             LogType logType = LogType.values()[index];// get a random LogType
             logListModel.addElement(logType);
          }
    
          logList.setVisibleRowCount(10);
          logList.setCellRenderer(new MyCellRenderer());
    
          add(new JScrollPane(logList));
       }
    
       private static void createAndShowGui() {
          JFrame frame = new JFrame("MainWindow");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(new MainWindow());
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
    enum LogType {
       ERROR("Error"), COMMENT("Comment"), READ_INFO("Read Info"), ACTION("Action"); 
       private String text;
    
       private LogType(String text) {
          this.text = text;
       }
    
       public String getText() {
          return text;
       }
    };
    
    @SuppressWarnings("serial")
    class MyCellRenderer extends DefaultListCellRenderer {
       private Map<LogType, Color> logTypeColorMap = new HashMap<>();
    
       public MyCellRenderer() {
          logTypeColorMap.put(LogType.ACTION, Color.blue);
          logTypeColorMap.put(LogType.COMMENT, Color.darkGray);
          logTypeColorMap.put(LogType.ERROR, Color.red);
          logTypeColorMap.put(LogType.READ_INFO, Color.magenta);
       }
    
       @Override
       public Component getListCellRendererComponent(JList<?> list, Object value,
             int index, boolean isSelected, boolean cellHasFocus) {
          LogType logType = (LogType) value;
          Color color = logTypeColorMap.get(logType);
          value = logType.getText(); // extract text
          Component c =super.getListCellRendererComponent(list, value, index, isSelected,
                cellHasFocus);
          c.setForeground(color);
          return c;
       }
    }
    
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.EventQueue;
    import java.awt.Font;
    import javax.swing.DefaultListCellRenderer;
    import javax.swing.DefaultListModel;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JScrollPane;
    
    //!! import src.MainWindow.LogType;
    
    public class MainWindow {
    
       private JFrame frmNavdng;
       private static DefaultListModel<LogType> logListModel = new DefaultListModel<>();
       private static JList<LogType> log_List = new JList<>(logListModel);
    
       public MainWindow() {
          initialize();
       }
    
       // !! get rid of this method as it is doing you no good whatsoever
       public static void add_Log_Line(LogType type, String s) {
          // type.setText(s);
          logListModel.addElement(type);
          log_List.ensureIndexIsVisible(log_List.getLastVisibleIndex());
       }
    
       private void initialize() {
          frmNavdng = new JFrame();
          frmNavdng.setFont(new Font("Tahoma", Font.PLAIN, 12));
          frmNavdng.setTitle("list_window");
          frmNavdng.setResizable(false);
          frmNavdng.setBounds(100, 100, 640, 400);
          frmNavdng.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frmNavdng.getContentPane().setLayout(null);
    
          JScrollPane scrollPane = new JScrollPane();
          scrollPane.setBounds(0, 0, frmNavdng.getWidth(), frmNavdng.getHeight());
          frmNavdng.getContentPane().add(scrollPane);
          scrollPane.setViewportView(log_List);
          log_List.setToolTipText("history of the last actions");
          log_List.setVisibleRowCount(10);
          log_List.setValueIsAdjusting(true);
          log_List.setFont(new Font("Tahoma", Font.PLAIN, 10));
          log_List.setCellRenderer(new MyCellRenderer());
       }
    
       public static void main(String[] args) {
          EventQueue.invokeLater(new Runnable() {
             public void run() {
                MainWindow window = new MainWindow();
                window.frmNavdng.setVisible(true);
                for (int i = 0; i < LogType.values().length; i++) {
                   // !! add_Log_Line(LogType.ACTION, ("loop " + i));
                   // !! just add to the list model the actual LogType
                   LogType logType = LogType.values()[i];
                   logListModel.addElement(logType);
                }
             }
          });
       }
    
    }
    
    class MyCellRenderer extends DefaultListCellRenderer {
    
       private static final long serialVersionUID = 1L;
    
       public MyCellRenderer() {
          setOpaque(true);
       }
    
       @Override
       public Component getListCellRendererComponent(JList<?> list, Object value,
             int index, boolean isSelected, boolean cellHasFocus) {
          LogType lt = (LogType) value;
    
          value = lt.getText();
    
          Color background = Color.white;
          Color foreground = Color.black;
          Font font = list.getFont();
    
          // !! note that you could hard-code the String held by value
          // here in these if blocks
          if (lt == LogType.ACTION) {
             foreground = Color.blue;
          }
    
          if (lt == LogType.COMMENT) {
             foreground = Color.darkGray;
          }
    
          if (lt == LogType.ERROR) {
             foreground = Color.red;
             font = new Font(list.getFont().getFontName(), Font.BOLD, list
                   .getFont().getSize());
          }
    
          if (lt == LogType.READ_INFO) {
             foreground = Color.magenta;
             font = new Font(list.getFont().getFontName(), Font.ITALIC, list
                   .getFont().getSize());
          }
    
          if (lt == LogType.PARAM_ERROR) {
             foreground = Color.orange;
             font = new Font(list.getFont().getFontName(), Font.BOLD, list
                   .getFont().getSize());
          }
    
          if (isSelected)
             background = Color.lightGray;
    
          Component c = super.getListCellRendererComponent(list, value, index,
                isSelected, cellHasFocus);
    
          c.setForeground(foreground);
          c.setBackground(background);
          c.setFont(font);
    
          return c;
       }
    }
    
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Font;
    import java.util.EnumMap;
    import java.util.Map;
    import javax.swing.*;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    
    public class MainWindow2 extends JPanel {
       private static final long serialVersionUID = 1L;
       private static final Font FONT = new Font(Font.DIALOG, Font.PLAIN, 12);
       private static DefaultListModel<LogType> logListModel = new DefaultListModel<>();
       private static JList<LogType> logList = new JList<>(logListModel);
    
       public MainWindow2() {
          Map<LogType, LogWrapper> wrapperMap = new EnumMap<>(LogType.class);
          wrapperMap.put(LogType.ACTION, new LogWrapper("Action", Font.PLAIN, Color.BLUE));
          wrapperMap.put(LogType.COMMENT, new LogWrapper("Comment", Font.PLAIN, Color.DARK_GRAY));
          wrapperMap.put(LogType.ERROR, new LogWrapper("Error", Font.BOLD, Color.RED));
          wrapperMap.put(LogType.READ_INFO, new LogWrapper("Read Info", Font.ITALIC, Color.MAGENTA));
          wrapperMap.put(LogType.PARAM_ERROR, new LogWrapper("Parameter Error", Font.BOLD, Color.ORANGE));
    
          for (int i = 0; i < LogType.values().length * 3; i++) {
             int index = i % LogType.values().length;
             logListModel.addElement(LogType.values()[index]);
          }
    
          logList.setToolTipText("history of the last actions");
          logList.setVisibleRowCount(10);
          logList.setValueIsAdjusting(true);
          logList.setFont(FONT);
          logList.setCellRenderer(new MyCellRenderer2(wrapperMap));
    
          JScrollPane scrollPane = new JScrollPane(logList);
          add(scrollPane);
    
          logList.addListSelectionListener(new ListSelectionListener() {
    
             @Override
             public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                   JList<LogType> list = (JList<LogType>) e.getSource();
                   LogType selection = list.getSelectedValue();
                   String message = String.format("Selected LogType: %s", selection);
                   JOptionPane.showMessageDialog(MainWindow2.this, message);
                }
             }
          });
    
       }
    
    
       private static void createAndShowGui() {
          JFrame frame = new JFrame("MainWindow2");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(new MainWindow2());
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
    class MyCellRenderer2 extends DefaultListCellRenderer {
       private static final long serialVersionUID = 1L;
       private static final Color DEFAULT_BG = Color.WHITE;
       private static final Color SELECTED_BG = Color.LIGHT_GRAY;
       private Map<LogType, LogWrapper> wrapperMap;
    
       public MyCellRenderer2(Map<LogType, LogWrapper> wrapperMap) {
          setOpaque(true);
          this.wrapperMap = wrapperMap;
       }
    
       @Override
       public Component getListCellRendererComponent(JList<?> list, Object value,
             int index, boolean isSelected, boolean cellHasFocus) {
          LogType lt = (LogType) value;
          LogWrapper logWrapper = wrapperMap.get(lt);
          String text = logWrapper.getText();
    
          Color background = isSelected ? SELECTED_BG : DEFAULT_BG;
          Color foreground = logWrapper.getForeground();
          Font font = list.getFont().deriveFont(logWrapper.getFontStyle());
    
          Component c = super.getListCellRendererComponent(list, text, index,
                isSelected, cellHasFocus);
    
          c.setForeground(foreground);
          c.setBackground(background);
          c.setFont(font);
    
          return c;
       }
    }
    
    class LogWrapper {
       private String text;
       private int fontStyle;
       private Color foreground;
    
       public LogWrapper(String text, int fontStyle, Color foreground) {
          this.text = text;
          this.fontStyle = fontStyle;
          this.foreground = foreground;
       }
    
       public String getText() {
          return text;
       }
    
       public int getFontStyle() {
          return fontStyle;
       }
    
       public Color getForeground() {
          return foreground;
       }
    
    }
    
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Font;
    import java.util.EnumMap;
    import java.util.Map;
    
    import javax.swing.*;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    
    public class MainWindow3 extends JPanel {
       private static final long serialVersionUID = 1L;
       private static final Font FONT = new Font(Font.DIALOG, Font.PLAIN, 12);
       private static DefaultListModel<LogWrapper3> logListModel = new DefaultListModel<>();
       private static JList<LogWrapper3> logList = new JList<>(logListModel);
    
       public MainWindow3() {
          Map<LogType, LogWrapper3> wrapperMap = new EnumMap<>(LogType.class);
          wrapperMap.put(LogType.ACTION, new LogWrapper3("Action", Font.PLAIN, Color.BLUE, LogType.ACTION));
          wrapperMap.put(LogType.COMMENT, new LogWrapper3("Comment", Font.PLAIN, Color.DARK_GRAY, LogType.COMMENT));
          wrapperMap.put(LogType.ERROR, new LogWrapper3("Error", Font.BOLD, Color.RED, LogType.ERROR));
          wrapperMap.put(LogType.READ_INFO, new LogWrapper3("Read Info", Font.ITALIC, Color.MAGENTA, LogType.READ_INFO));
          wrapperMap.put(LogType.PARAM_ERROR, new LogWrapper3("Parameter Error", Font.BOLD, Color.ORANGE, LogType.PARAM_ERROR));
    
          for (int i = 0; i < 8; i++) {
             for (int j = 0; j < LogType.values().length; j++) {
                LogType logType = LogType.values()[j];
                LogWrapper3 wrapper = new LogWrapper3(wrapperMap.get(logType));
                String text = "Type : " + logType.toString() + " - Loop : " + i;
                wrapper.setText(text);
                logListModel.addElement(wrapper);
             }
          }
    
          logList.setToolTipText("history of the last actions");
          logList.setVisibleRowCount(10);
          logList.setValueIsAdjusting(true);
          logList.setFont(FONT);
          logList.setCellRenderer(new MyCellRenderer3());
    
          JScrollPane scrollPane = new JScrollPane(logList);
          add(scrollPane);
    
          logList.addListSelectionListener(new ListSelectionListener() {
    
             @Override
             public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                   JList<LogWrapper3> list = (JList<LogWrapper3>) e.getSource();
                   LogWrapper3 selection = list.getSelectedValue();
                   String message = String.format("Selected LogType: %s", selection.getLogType());
                   JOptionPane.showMessageDialog(MainWindow3.this, message);
                }
             }
          });
       }
    
       private class MyCellRenderer3 extends DefaultListCellRenderer {
          private static final long serialVersionUID = 1L;
          private final Color DEFAULT_BG = Color.WHITE;
          private final Color SELECTED_BG = Color.LIGHT_GRAY;
    
          public MyCellRenderer3() {
             setOpaque(true);
          }
    
          @Override
          public Component getListCellRendererComponent(JList<?> list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
             LogWrapper3 ltw = (LogWrapper3) value;
    
             Color background = isSelected ? SELECTED_BG : DEFAULT_BG;
             Color foreground = ltw.getForeground();
             Font font = list.getFont().deriveFont(ltw.getFontStyle());
    
             Component c = super.getListCellRendererComponent(list, ltw.getText(), index,
                   isSelected, cellHasFocus);
    
             c.setForeground(foreground);
             c.setBackground(background);
             c.setFont(font);
    
             return c;
          }
       }
    
       private class LogWrapper3 {
          private String text;
          private int fontStyle;
          private Color foreground;
          private LogType logType;
    
          public LogWrapper3(String text, int fontStyle, Color foreground, LogType logType) {
             this.text = text;
             this.fontStyle = fontStyle;
             this.foreground = foreground;
             this.logType = logType;
          }
    
          // copy constructor
          public LogWrapper3(LogWrapper3 lw3) {
             this.text = lw3.text;
             this.fontStyle = lw3.fontStyle;
             this.foreground = lw3.foreground;
             this.logType = lw3.logType;
          }
    
          public String getText() {
             return text;
          }
    
          public void setText(String text) {
             this.text = text;
          }
    
          public int getFontStyle() {
             return fontStyle;
          }
    
          public Color getForeground() {
             return foreground;
          }
    
          public LogType getLogType() {
             return logType;
          }
    
       }
    
       enum LogType {
          ERROR("Error"), COMMENT("Comment"), READ_INFO("Read Info"), ACTION("Action"), PARAM_ERROR("Param Error"); 
          private String text;
    
          private LogType(String text) {
             this.text = text;
          }
    
          public String getText() {
             return text;
          }
       };
    
    
       private static void createAndShowGui() {
          JFrame frame = new JFrame("MainWindow2");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(new MainWindow3());
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
    package src;
    
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.EventQueue;
    import java.awt.Font;
    
    import javax.swing.DefaultListCellRenderer;
    import javax.swing.DefaultListModel;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JScrollPane;
    
    import com.sun.javafx.css.converters.FontConverter.FontStyleConverter;
    
    import src.MainWindow.LogEntry;
    import src.MainWindow.LogType;
    
    public class MainWindow {
    
        public enum LogType {
            // @formatter:off
            ERROR("Error", Color.RED, Font.BOLD),
            COMMENT("Comment", Color.BLUE, Font.ITALIC),
            READ_INFO("Read_Info", Color.BLACK, 0),
            ACTION("Action", Color.YELLOW, 0),
            PARAM_ERROR("Param_Error", Color.RED, Font.ITALIC | Font.BOLD);
            // @formatter:on
    
            String text;
            Color color;
            int fontStyle;
    
            private LogType(String s, Color color, int fontStyle) {
                this.text = s;
                this.color = color;
                this.fontStyle = fontStyle;
            }
    
            public void setText(String s) {
                this.text = s;
            }
    
            public String getText() {
                return text;
            }
    
            public int getFontStyle() {
                return fontStyle;
            }
    
            public Color getColor() {
                return color;
            }
        };
    
        public static class LogEntry {
            private LogType type;
            private String text;
    
            public LogEntry(LogType type, String text) {
                this.type = type;
                this.text = text;
            }
    
            public LogType getType() {
                return type;
            }
    
            public String getText() {
                return text;
            }
        }
    
        private JFrame frmNavdng;
        private static DefaultListModel<LogEntry> logListModel = new DefaultListModel<>();
        private static JList<LogEntry> log_List = new JList<>(logListModel);
    
        public MainWindow() {
            initialize();
        }
    
        public static void add_Log_Line(LogType type, String s) {
            // add action to the log list
            type.setText(s);
            logListModel.addElement(new LogEntry(type, s));
            log_List.ensureIndexIsVisible(log_List.getLastVisibleIndex());
        }
    
        private void initialize() {
            /** Frame Initialisation */
            frmNavdng = new JFrame();
            frmNavdng.setFont(new Font("Tahoma", Font.PLAIN, 12));
            frmNavdng.setTitle("list_window");
            frmNavdng.setResizable(false);
            frmNavdng.setBounds(100, 100, 640, 400);
            frmNavdng.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frmNavdng.getContentPane().setLayout(null);
    
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setBounds(0, 0, frmNavdng.getWidth(), frmNavdng.getHeight());
            frmNavdng.getContentPane().add(scrollPane);
            scrollPane.setViewportView(log_List);
            log_List.setToolTipText("history of the last actions");
            log_List.setVisibleRowCount(10);
            log_List.setValueIsAdjusting(true);
            log_List.setFont(new Font("Tahoma", Font.PLAIN, 10));
            log_List.setCellRenderer(new MyCellRenderer());
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        MainWindow window = new MainWindow();
                        window.frmNavdng.setVisible(true);
                        LogType[] values = LogType.values();
                        for (LogType logType : values) {
                            add_Log_Line(logType, "This is log type " + logType.getText());
                        }
                    } catch (Exception e) {
                        e.toString();
                    }
                }
            });
        }
    
    }
    
    class MyCellRenderer extends DefaultListCellRenderer {
    
        private static final long serialVersionUID = 1L;
    
        public MyCellRenderer() {
            setOpaque(true);
        }
    
        @Override public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected,
                boolean cellHasFocus) {
            LogEntry entry = (LogEntry) value;
    
            value = entry.getText();
    
            Color background = Color.white;
            Color foreground = entry.getType().getColor();
    
            Font font = list.getFont();
    
            font = new Font(list.getFont().getFontName(), entry.getType().getFontStyle(), list.getFont().getSize());
    
            if (isSelected)
                background = Color.lightGray;
    
            Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    
            c.setForeground(foreground);
            c.setBackground(background);
            c.setFont(font);
    
            return c;
        }
    }