Как установить другой цвет текста в соответствии с перечислением в 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", например, в качестве ДЕЙСТВИЯ.
С приведенным кодом я не понимаю, как и где я могу установить этот текст и сделать его "статичным" (то есть здесь он не изменится).
--------- СТАРЫЙ ВОПРОС ---------
Я использую JList в качестве средства просмотра журнала, и я хотел бы добавить несколько строк другого цвета. Например, у меня есть enum
с типами 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;
}
}
все, что я получаю, это черный на белом цветном списке...
2 ответа
Я сомневаюсь, что вы действительно хотите добавить типы журналов в 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;
}
}
Мне все еще нравится, как Карты уплотняют код, облегчая отладку и использование. Например, я хотел бы сделать что-то вроде этого:
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, то
- сделать универсальный тип JList и его модель классом-оболочкой.
- измените обертку, чтобы включить enum.
- Создайте уникальный экземпляр оболочки для каждого элемента, добавляемого в список, с уникальным значением текстового поля. Конструктор копирования может хорошо работать для этого, если вы хотите установить шрифт и цвет только один раз.
Например (пример кода 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();
}
});
}
}