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

Posted byte01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()));



 




以上是关于Swing开发界面时的一个bug复盘的主要内容,如果未能解决你的问题,请参考以下文章

java swing怎样开发出漂亮的界面

开发一个Swing功能时的一点总结

Bug解决过程复盘

创建第一个界面程序

java swing怎样开发出漂亮的界面

Swing001——入门简介