生活随笔
收集整理的這篇文章主要介紹了
Swing开发界面时的一个bug复盘
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
問題:
QA突然發(fā)個截圖說一個Dialog上展示的東西變形了
分析:
不理解,什么也沒做,怎么會變形,剛剛我用的時候還正常。
看看代碼,的確什么也沒更改;
在本地測一下,也沒有問題;
baidu,bing,stackoverflow下,沒找到什么線索
突然看到一個ComboBox下面有一個item的值比較長,
布局使用的是GridBagLayout,也就是相對布局,如果設置Size是固定的,如果有一個控件變大,則整體的布局變形了
因此這個Combobox item的值比較長解決了,這個問題就解決了。
解決的思路:
如果JComboBox列表中的內(nèi)容過長的話,下拉框中不全部顯示
解決方法一:當鼠標放在這個過長的項目中時顯示tooltip,提示用戶選擇這項的全部信息
解決方法二:獲取最大長項目寬度,并設置為彈出下拉框時的寬度
http://blog.chinaunix.net/uid-12888785-id-2384254.html
最終采用的是方法一,重寫JcomboBox,里面存在兩個Map,map1<model-element,displayName>,map2<model-element,displayName4ToolTextTip>
分為三種數(shù)據(jù):Model,displayName,toolTextTip
復盤:
如果出現(xiàn)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 {@Overridepublic void itemStateChanged(ItemEvent e) {setToolTipText(getToolTipText4Display(getSelectedItem()));}}} ?
總結
以上是生活随笔為你收集整理的Swing开发界面时的一个bug复盘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。