• Swing开发界面时的一个bug复盘


    问题:
    QA突然发个截图说一个Dialog上展示的东西变形了

    分析:
    不理解,什么也没做,怎么会变形,刚刚我用的时候还正常。
    看看代码,的确什么也没更改;
    在本地测一下,也没有问题;
    baidu,bing,stackoverflow下,没找到什么线索

    突然看到一个ComboBox下面有一个item的值比较长,

    布局使用的是GridBagLayout,也就是相对布局,如果设置Size是固定的,如果有一个控件变大,则整体的布局变形了

    因此这个Combobox item的值比较长解决了,这个问题就解决了。

    解决的思路:
    如果JComboBox列表中的内容过长的话,下拉框中不全部显示
    解决方法一:当鼠标放在这个过长的项目中时显示tooltip,提示用户选择这项的全部信息
    解决方法二:获取最大长项目宽度,并设置为弹出下拉框时的宽度
    http://blog.chinaunix.net/uid-12888785-id-2384254.html

    最终采用的是方法一,重写JcomboBox,里面存在两个Map,map1<model-element,displayName>,map2<model-element,displayName4ToolTextTip>
    分为三种数据:Model,displayName,toolTextTip

    复盘:
    如果出现bug,找问题原因要了解场景,出bug时要了解问题前和问题后的差异,
    有差异时,就找是否由差异引起的,
    没有差异时,就确定是否是隐藏的bug:由于某些值超过Threshold,要查看出bug前的值和bug后的值有什么不同,缩小查找bug的范围

    (1)更改引起bug
    (2)某些值的改变引起bug

     
    重写的JComboBox:

    import java.awt.Color;
    import java.awt.Component;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.DefaultListCellRenderer;
    import javax.swing.JComboBox;
    import javax.swing.JComponent;
    import javax.swing.JList;
    
    public class JComboBox4ItemWidth extends JComboBox {
        private static final long serialVersionUID = 1L;
    
        private Map<String, String> antFactory_value_displayName4toolTipText;
        private Map<String, String> antFactory_value_displayName4dispaly = new HashMap<String, String>();
    
        public JComboBox4ItemWidth() {
    
            this.setRenderer(new ListCellRendererImpl());
            this.addItemListener(new ItemListenerImpl());
            this.setBackground(Color.WHITE);
        }
    
        public void setModelData(Object antFactory_value_displayName) {
            this.antFactory_value_displayName4toolTipText = (Map<String, String>) antFactory_value_displayName;
            Set<Entry<String, String>> antFactorys = this.antFactory_value_displayName4toolTipText.entrySet();
            DefaultComboBoxModel model = new DefaultComboBoxModel();
    
            for (Entry<String, String> antFactory : antFactorys) {
                antFactory_value_displayName4dispaly.put(antFactory.getKey(), format(antFactory.getValue()));
                model.addElement(antFactory.getKey());
            }
            this.setModel(model);
    
        }
    
        private String format(String displayValue) {
            if (displayValue.length() > 9) {
                displayValue = displayValue.substring(0, 6) + "...";
            }
            return displayValue;
        }
    
        public void setMoValue(Object value) {
            if (value != null && value.toString().trim().length() > 0) {
                this.setSelectedItem(value.toString());
                this.setToolTipText(getToolTipText4Display(value));
            } else {
                this.setSelectedIndex(-1); // 若从服务端得到的值是空,则界面显示空
                this.setToolTipText("");
            }
        }
    
        public Object getMoValue() {
            Object value = this.getSelectedItem();
            if (value != null && value.toString().trim().length() == 0) {
                value = "";
            }
            return value;
        }
    
        public String getDisplayValue(Object antFacotryValue) {
            String displayValue = this.antFactory_value_displayName4dispaly.get((String) antFacotryValue);
            return displayValue == null ? " " : displayValue;// 为空是需要空格,下拉选项才可显示出空值选项
        }
    
        public String getToolTipText4Display(Object antFacotryValue) {
            String displayValue = this.antFactory_value_displayName4toolTipText.get(antFacotryValue.toString());
            return displayValue == null ? " " : displayValue;// 为空是需要空格,下拉选项才可显示出空值选项
        }
    
        class ListCellRendererImpl extends DefaultListCellRenderer {
            private static final long serialVersionUID = -6671159080681655776L;
    
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                String display = getDisplayValue(value);
                JComponent comp = (JComponent) super.getListCellRendererComponent(list, display, index, isSelected, cellHasFocus);
                comp.setToolTipText(getToolTipText4Display(value));
                return comp;
            }
        }
    
        class ItemListenerImpl implements ItemListener {
            @Override
            public void itemStateChanged(ItemEvent e) {
                setToolTipText(getToolTipText4Display(getSelectedItem()));
            }
        }
    
    }




  • 相关阅读:
    JSP页面中如何注入Spring容器中的bean
    struts2之Action与JSP相互数据传递
    IOS APP开发入门案例
    Android资源文件命名规范学习手册
    自定义控件之实现在线签名,保存,清除等功能实现
    SpringBoot+Mybatis+Maven+MySql小案例
    springBoot注解搜集
    SpringBoot打包war
    SpringBoot之返回json数据
    springboot之freemarker 和thymeleaf模板web开发
  • 原文地址:https://www.cnblogs.com/softidea/p/4617426.html
Copyright © 2020-2023  润新知