代码之家  ›  专栏  ›  技术社区  ›  Julian Lettner

JavaSwing:在JListBox中显示的SET成员

  •  2
  • Julian Lettner  · 技术社区  · 15 年前

    对于jlistbox swing组件,是否有与.net“set displaymember”类似的机制?

    重写 toString() 方法不够,因为我还希望能够在运行时更改显示成员。

    我还研究了如何实现我自己的 ListCellRenderer ,但发现不太方便。

    有更简单或更优雅的方法吗?

    谢谢你的时间。

    2 回复  |  直到 15 年前
        1
  •  0
  •   willcodejavaforfood    15 年前

    您应该在业务对象周围创建一个覆盖toString()的包装类。这样您就可以保持自己的对象干净,并且可以在运行时交换包装器。

    public class MyWrapper()
    {
        private MyBusinessObject object;
    
        public String toString()
        {
            return object.getImportantString();
        }
    }
    
        2
  •  0
  •   Julian Lettner    15 年前

    我在实现自定义 ListCellRenderer .

    import java.awt.Component;
    import javax.swing.DefaultListCellRenderer;
    import javax.swing.JList;
    import javax.swing.ListCellRenderer;
    
    public class DynamicCellRenderer implements ListCellRenderer {
        private final ListCellRenderer listCellRenderer;
        private String displayMember;
    
        public DynamicCellRenderer(String displayMember) {
            this(displayMember, new DefaultListCellRenderer());
        }
    
        public DynamicCellRenderer(String displayMember, ListCellRenderer wrapped) {
            listCellRenderer = wrapped;
            this.displayMember = displayMember;
        }
    
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Object displayMemberValue = getDisplayMemberValue(value);
            return listCellRenderer.getListCellRendererComponent(list, displayMemberValue, index, isSelected, cellHasFocus);
        }
    
        private Object getDisplayMemberValue(Object value) {
            // value is the domain class
            // only works if display member is a method, TODO: fallback to field
            // displayMember is something like "getName" -> value.getName() gets called
            try {
                return value.getClass().getMethod(displayMember).invoke(value);
            } catch (Exception ex) {
                // if anything went wrong it is the programmers fault -> propagate exception
                throw new RuntimeException(ex);
            }
        }
    
        public String getDisplayMember() {
            return displayMember;
        }
    
        public void setDisplayMember(String displayMember) {
            this.displayMember = displayMember;
        }
    
    }
    

    在客户端gui代码中,可以执行以下操作:

    jListBox1.setCellRenderer(new DynamicCellRenderer("getName"));
    ...
    ...
    // and later at some point
    ((DynamicCellRenderer) jListBox1.getCellRenderer()).setDisplayMember("getEmail");