Changing JList row color at runtime?

Based on ListDemo sample from SUN. If you enter some text in the textfield which isn't in the list and you hit highlight it gets added. If the text is in the list and you hit highlight the entry in the list gets temporarily highlighted blue.

Note the solution here with the match field is just for demo. For more correct implementation consider the other ideas proposed and consider using javax.swing. Timer import java.awt.

*; import java.awt.event. *; import javax.swing. *; import javax.swing.event.

*; public class ListDemo extends JPanel { private JList list; private DefaultListModel listModel; public String match = null; private static final String hireString = " private JTextField employeeName; public ListDemo() { super(new BorderLayout()); listModel = new DefaultListModel(); listModel. AddElement("Test1"); listModel. AddElement("Test2"); listModel.

AddElement("Test3"); list = new JList(listModel); list. SetSelectionMode(ListSelectionModel. SINGLE_SELECTION); list.

SetSelectedIndex(0); list. SetVisibleRowCount(5); list. SetCellRenderer(new MyListCellRenderer()); JScrollPane listScrollPane = new JScrollPane(list); JButton hireButton = new JButton(hireString); reListener hireListener = new hireButton.

SetActionCommand(hireString); hireButton. AddActionListener(hireListener); hireButton. SetEnabled(false); employeeName = new JTextField(10); employeeName.

AddActionListener(hireListener); employeeName.getDocument(). AddDocumentListener(hireListener); listModel. GetElementAt(list.

GetSelectedIndex()).toString(); JPanel buttonPane = new JPanel(); buttonPane. SetLayout(new BoxLayout(buttonPane, BoxLayout. LINE_AXIS)); buttonPane.

Add(Box. CreateHorizontalStrut(5)); buttonPane. Add(employeeName); buttonPane.

Add(hireButton); buttonPane. SetBorder(BorderFactory. CreateEmptyBorder(5,5,5,5)); add(listScrollPane, BorderLayout.

CENTER); add(buttonPane, BorderLayout. PAGE_END); } class MyListCellRenderer extends JLabel implements ListCellRenderer { public MyListCellRenderer() { setOpaque(true); } public Component getListCellRendererComponent(JList paramlist, Object value, int index, boolean isSelected, boolean cellHasFocus) { setText(value.toString()); if (value.toString(). Equals(match)) { setBackground(Color.

BLUE); SwingWorker worker = new SwingWorker() { @Override public Object doInBackground() { try { Thread. Sleep(5000); } catch (InterruptedException e) { /*Who cares*/ } return null; } @Override public void done() { match = null; list.repaint(); } }; worker.execute(); } else setBackground(Color. RED); return this; } } class reListener implements ActionListener, DocumentListener { private boolean alreadyEnabled = false; private JButton button; public reListener(JButton button) { this.

Button = button; } public void actionPerformed(ActionEvent e) { String name = employeeName.getText(); if (listModel. Contains(name)) { match = name; list.repaint(); employeeName. RequestFocusInWindow(); employeeName.selectAll(); return; } if (name.

Equals("")) { Toolkit. GetDefaultToolkit().beep(); employeeName. RequestFocusInWindow(); employeeName.selectAll(); return; } int index = list.

GetSelectedIndex(); if (index == -1) index = 0; else index++; listModel. InsertElementAt(employeeName.getText(), index); employeeName. RequestFocusInWindow(); employeeName.

SetText(""); list. SetSelectedIndex(index); list. EnsureIndexIsVisible(index); } public void insertUpdate(DocumentEvent e) { enableButton(); } public void removeUpdate(DocumentEvent e) { handleEmptyTextField(e); } public void changedUpdate(DocumentEvent e) { if (!handleEmptyTextField(e)) enableButton(); } private void enableButton() { if (!alreadyEnabled) button.

SetEnabled(true); } private boolean handleEmptyTextField(DocumentEvent e) { if (e.getDocument().getLength() EXIT_ON_CLOSE); JComponent newContentPane = new ListDemo(); newContentPane. SetOpaque(true); frame. SetContentPane(newContentPane); frame.pack(); frame.

SetVisible(true); } public static void main(String args) { javax.swing.SwingUtilities. InvokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }.

– akf Nov 3 '09 at 4:36 Thank You. It works perfectly. – Maciek Sawicki Nov 3 '09 at 4:48 you are right of course.

Replaced with swingworker implementation – jitter Nov 3 '09 at 4:55.

Your custom ListCellRenderer, which implements the method getListCellRendererComponent, will have access to both the JList and the value that it is redering. This gives you a couple options for how to determine when to paint the nth row green: You could subclass JList and have the renderer ask it which color to use for the bg. The JList subclass could trigger a repaint when the business logic determines that it is time for the nth row to be green, and then start an Swing Timer to trigger a repaint returning the bg back to normal When the business logic determines when you should show the row as green, you also have the option of setting state on the backing object of the row, and test it for that state within getListCellRendererComponent, setting the bg green if the state is correct.

Again, you have the option of setting an Swing Timer to revert the state on the backing object.

Simple, set a custom ListCellRenderer to your JList using: list. SetCellRenderer(myListCellrenderer); Now inside the overridden method getListCellRendererComponent() do something like this: public Component getListCellRendererComponent(.....) { Component c = super. GetListCellRendererComponent(); c.

SetBackGround(Color. Blue) return c; } The above example assumed that your custom renderer overrid DefaultListCellRenderer.

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions