博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swing开发界面时的一个bug复盘
阅读量:6986 次
发布时间:2019-06-27

本文共 3814 字,大约阅读时间需要 12 分钟。

 

问题:

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
antFactory_value_displayName4toolTipText; private Map
antFactory_value_displayName4dispaly = new HashMap
(); 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
) antFactory_value_displayName; Set
> antFactorys = this.antFactory_value_displayName4toolTipText.entrySet(); DefaultComboBoxModel model = new DefaultComboBoxModel(); for (Entry
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())); } }}

 

转载地址:http://hvmpl.baihongyu.com/

你可能感兴趣的文章
Strom的trident单词计数代码
查看>>
二叉树的构造
查看>>
代码段:ASCII to Unicode
查看>>
内存管理单元编程实例【转】
查看>>
Viewstate
查看>>
ASP.NET MVC之Unobtrusive Ajax(五)
查看>>
[LeetCode] Dungeon Game 地牢游戏
查看>>
实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈
查看>>
Java 序列化的高级认识
查看>>
3、ASP.NET MVC入门到精通——Entity Framework增删改查
查看>>
C/C++中手动获取调用堆栈【转】
查看>>
Linux中断(interrupt)子系统之五:软件中断(softIRQ)【转】
查看>>
使用T4模板生成POCO类
查看>>
图像的马赛克艺术化
查看>>
DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案
查看>>
欧几里得求最大公约数
查看>>
浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色
查看>>
线程2种方式的差异
查看>>
JQUERY判断操作CHECKBOX选中、取消选中、反选、第二次无法选中的问题
查看>>
Javascript设计模式之匿名函数与闭包
查看>>