簡體   English   中英

如何根據JList中的枚舉設置不同的文本顏色?

[英]How to set different text color according to an enum in JList?

編輯:這是@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;
    }
}

編輯2:這是我得到的以及我想要得到的說明:

如果我運行@HovercraftFullofEels給定的代碼,請稍加修改以更改文本:

for(int i = 0; i<= 10; i++)
{
    LogType logType = LogType.values()[i];
    //just added this line
    logType.setText("Type : " + logType.toString() + " - Loop : " + i);
    logListModel.addElement(logType);
}

我得到這個結果: 我通過運行代碼得到什么 每種類型的日志都會獲取每個日志的最后一個文本...如果他們能得到我一開始就給他們的文本,那將是很棒的選擇,這樣在我可以顯示諸如“無法打開文件”之類的文本后,錯誤類型和樣式,例如,使用READ_INFO樣式和類型的“此文件中給定的參數錯誤,將被忽略”,並將“結果寫入文件result.txt”作為ACTION。

使用給出的代碼,我不知道如何以及在何處設置此文本並將其設置為“靜態”(這意味着此處不會更改)。

- - - - - - - - -老問題- - - - - - - - -

我正在使用JList作為日志查看器,並且我想添加一些顏色不同的行。 例如,我有一個類型為COMMENTACTIONERRORenum COMMENT將顯示為深灰色, ACTION將顯示為藍色, ERROR將顯示為紅色。

我試圖創建一個自定義的ListCellRendered ,但是我無法弄清楚如何根據enum設置不同的顏色。

這是我的代碼:

public class MainWindow {
/* all the other declarations... */
private static JList<String> log_List;

/* configuration of the list somewhere in the code */
log_List = new JList<String>(new DefaultListModel<String>());
scrollPane.setViewportView(log_List);
log_List.setToolTipText("history of the last actions");
log_List.setVisibleRowCount(10);
log_List.setValueIsAdjusting(true);
log_List.setCellRenderer(new MyCellRenderer());

public enum LOG_TYPE {
    ERROR, COMMENT, READ_INFO, ACTION
};

// add action to the log list
public static void add_Log_Line(LOG_TYPE type, String s) {
//what I did before, but not working... 
/* if (type == LOG_TYPE.ERROR)  log_List.setForeground(Color.red);
    if (type == LOG_TYPE.ACTION) log_List.setForeground(Color.blue);
    if (type == LOG_TYPE.COMMENT) log_List.setForeground(Color.darkGray);
    if (type == LOG_TYPE.READ_INFO)log_List.setForeground(Color.magenta); */

    ((DefaultListModel<String>) log_List.getModel()).addElement(s);
    //makes the last raw visible after adding a line
    log_List.ensureIndexIsVisible(log_List.getLastVisibleIndex());
}

/* somewhere else in the code */
//add the path of a file chosen in a JFileChooser (fc)
add_Log_Line(LOG_TYPE.ACTION, "OPEN - " + fc.getSelectedFile().getAbsolutePath());


/* My custom cell renderer */
class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
public MyCellRenderer() {
    setOpaque(true);
}

public Component getListCellRendererComponent(JList<?> list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {

    setText(value.toString());

    Color background = Color.white;
    Color foreground = Color.black;

    if (value == LOG_TYPE.ACTION)
        foreground = Color.blue;
    if (value == LOG_TYPE.COMMENT)
        foreground = Color.darkGray;
    if (value == LOG_TYPE.ERROR)
        foreground = Color.red;
    if (value == LOG_TYPE.READ_INFO)
        foreground = Color.magenta;

    setForeground(foreground);
    setBackground(background);

    return this;
}

}

我得到的只是一張黑白名單上的黑色...

我懷疑您是否真的要將日志類型添加到JList。 我添加了一個名為LogEntry的類並更新了代碼。 看看是否有幫助。

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;
    }
}

根據我們的討論,在渲染器中設置顏色,然后在此處設置文本。 在這里,我更改了枚舉,使其返回顯示字符串,但是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.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;
   }
}

我個人仍然喜歡Maps壓縮代碼的方式,從而更易於調試和使用。 例如,我會考慮做這樣的事情:

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;
   }

}

如果您嘗試在JList中的每一行使用唯一的文本,則

  1. 使JList的泛型類型及其模型成為包裝器類。
  2. 更改包裝器以包含枚舉。
  3. 為要添加到列表中的每個項目創建唯一的包裝實例,其中一個實例具有唯一的文本字段值。 如果只想設置一次字體和顏色,則復制構造函數可以很好地實現此目的。

例如(代碼示例3):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM