2013-09-28 30 views
0

如何更改只有一个JList单元的JLabel图标(例如:单击JList)? 我试图访问的JLabel与listCellRender得到,但它不工作:如何在运行时更改JList的单元图标

@Override 
    public void valueChanged(ListSelectionEvent e) { 
     if (!e.getValueIsAdjusting()) { 
      ListCellRenderer r = list.getCellRenderer(); 
      JLabel comp = (JLabel) r.getListCellRendererComponent(list, list.getSelectedValue(), list.getSelectedIndex(), false, false); 
      comp.setIcon(UIManager.getIcon("Tree.leafIcon")); 
    } 

谁能给一些想法? 在此先感谢!

我的代码:

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

/** 
* @see http://stackoverflow.com/questions/7620579 
* @see http://stackoverflow.com/questions/4176343 
*/ 
public class ListPanel extends JPanel { 

    private static final long serialVersionUID = -5558761237888601952L; 
    private static final int N = 5; 
    private DefaultListModel dlm = new DefaultListModel(); 
    private JList list = new JList(dlm); 
    private ListRenderer myRender; 
    // http://stackoverflow.com/questions/13752188/chat-client-emoticons-window-java 
    // http://docs.oracle.com/javase/tutorial/uiswing/components/icon.html VER 

    public ListPanel() { 
     super(new GridLayout()); 

     for (int i = 0; i < N * N; i++) { 
      String name = "Cell: " + i;//String.format("%02d", i); 
      dlm.addElement(name); 
     } 
     //dlm.getElementAt(0) 
     list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
     //list.getCellRenderer().getListCellRendererComponent(list, value, index, isSelected, cellHasFocus) 
     list.setLayoutOrientation(JList.HORIZONTAL_WRAP); 
     list.setVisibleRowCount(N); 
     myRender = new ListRenderer(); 
     list.setCellRenderer(myRender); 
     list.addListSelectionListener(new SelectionHandler()); 
     JScrollPane pane = new JScrollPane(list); 
     this.add(pane, BorderLayout.CENTER); 
    } 

    private class ListRenderer extends DefaultListCellRenderer { 


     @Override 
     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      //System.out.println(">> " + index); 
      label.setBorder(BorderFactory.createEmptyBorder(N, N, N, N)); 
      label.setIcon(UIManager.getIcon("html.pendingImage")); 
      label.setHorizontalTextPosition(JLabel.CENTER); 
      label.setVerticalTextPosition(JLabel.BOTTOM); 
      return label; 
     } 
    } 

    private class SelectionHandler implements ListSelectionListener { 

     @Override 
     public void valueChanged(ListSelectionEvent e) { 
      if (!e.getValueIsAdjusting()) { 
       System.out.println(list.getSelectedValue()); 
      } 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("ListPanel"); 
     //f.setPreferredSize(new Dimension(400, 400)); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ListPanel().display(); 
      } 
     }); 
    } 
} 

回答

2

你倒着做。单元格渲染器应简单地使用isSelected参数,如果此参数为true,则设置所需的图标,如果该参数为false,则不设置图标。

不需要选择监听器。当选择改变时,渲染器将自动被调用。

+0

嗨!举个例子,我使用了一个选择监听器。我想将当前图标更改为另一个图标。你可以帮我吗? – SpecTrum

+0

正如我所说。渲染器的工作是设置图标。在渲染器中检查渲染值是什么(或其索引,或其选定的标志,或其他),并根据此值设置适当的图标。请参阅http://docs.oracle.com/javase/tutorial/uiswing/components/list.html#renderer –

+0

我想在渲染器之外完成这项工作。举个例子,我使用选择监听器。这可能吗?谢谢! – SpecTrum

2
  • 我认为有作为public void valueChanged(ListSelectionEvent e) {ListSelectionListener更简单的方法

  • 看到getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {那里你可以重写isSelected,对于selectionModel设置multisleection更好cellHasFocus

+0

但是,如何为单个单元格设置图标?我没有getListCellRendererComponent方法的进展。谢谢! – SpecTrum

+1

@SpecTrum:一个完整​​的例子被引用[here](http://stackoverflow.com/a/13754697/230513)。 – trashgod

+0

@trashgod渲染后有什么方法可以改变图标吗?感谢帮助! – SpecTrum

1

有任何方式来改变渲染后的图标?

您可以根据渲染时的标准(如索引或值)动态选择图标。使用引用here的示例,以下呈现器会生成所示的图像。您可以随时更新图标和repaint()

list panel icons

private class ListRenderer extends DefaultListCellRenderer { 

    Icon icon1 = UIManager.getIcon("html.pendingImage"); 
    Icon icon2 = UIManager.getIcon("html.missingImage"); 

    public ListRenderer() { 
     this.setBorder(BorderFactory.createLineBorder(Color.red)); 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object 
      value, int index, boolean isSelected, boolean cellHasFocus) { 
     JLabel label = (JLabel) super.getListCellRendererComponent(
      list, value, index, isSelected, cellHasFocus); 
     label.setBorder(BorderFactory.createEmptyBorder(N, N, N, N)); 
     label.setIcon(icon1); 
     if (index % 2 == 0) { 
      label.setIcon(icon2); 
     } 
     label.setHorizontalTextPosition(JLabel.CENTER); 
     label.setVerticalTextPosition(JLabel.BOTTOM); 
     return label; 
    } 
}