編集: @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;
}
}
EDIT 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);
}
私はこの結果を得る:
ログの各タイプは、それぞれに与えられた最後のテキストを取得します...そして、最初に与えたテキストを取得できれば、「開くことができませんでした」のようなテキストを表示できるようになりますファイル」を ERROR タイプとスタイルで、「このファイルで指定されたパラメータが間違っています。無視されます」を READ_INFO スタイルとタイプで、「ファイル result.txt に書き込まれた結果」を ACTION として、たとえば.
指定されたコードでは、このテキストを設定して「静的」にする方法と場所がわかりません(ここでは変更されません)。
- - - - - - - - - 古い質問 - - - - - - - - -
ログ ビューアとしてJListを使用しています。いくつかの行を別の色で追加したいと考えています。たとえばenum
、タイプがCOMMENT、ACTION、およびERRORの があります。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;
}
}
私が得るのは白地に黒のリストだけです...