问题:
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复盘的更多相关文章

  1. [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found

    google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...

  2. 【Qt】无边框窗体中带有ActiveX组件时的一个BUG

    无意中发现的一个BUG,Qt5.1.1正式版首先创建一个GUI工程,拖入一个QAxWidget控件(为了使ActiveX生效,需要在.pro文件中加入CONFIG += qaxcontainer)接着 ...

  3. ADO.NET(OleDb)读取Excel表格时的一个BUG

    如果我们有例如以下一个Excel表格:    如今要使用C#程序读取其内容: using System;  using System.Data.OleDb;    namespace Skyiv.Be ...

  4. java中的swing设计界面时怎么加上背景图片。而不覆盖其他控件?

    通过以下方式设置下背景就可以了: import java.awt.Container; import javax.swing.ImageIcon; import javax.swing.JFrame; ...

  5. echarts折线图动态改变数据时的一个bug

    echarts折线图中当增加dataZoom,修改start大于0的时候,会出现折线混乱,变成竖直的线,绘制有问题. 解决方法,在dataZoom中增加filterMode: 'empty' http ...

  6. 开发ArcEngine时的一个提示,无效位图,无法在类“***”中找到资源“***.bmp”

    解决办法:文件属性-生成操作 修改为 :嵌入式资源.

  7. VS开发ArcEngine时的一个异常信息——“ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components.”

    问题描述:程序报错“ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS ...

  8. Swing开发图形界面有如下优势

    Swing开发图形界面有如下优势 : Swing组件不再依赖于本地平台的GUI,无须采用各种平台的GUI交集,因此Swing提供了大量图形界面组件,远远超出了AWT所提供的图形界面组件集. Swing ...

  9. swing开发图形界面工具配置(可自由拖控件上去)

    swing开发图形界面工具,eclipse swing图形化操作界面工具配置 1.有一个小功能要有一个界面,之前知道有一个 图形化界面的(就是可以往上面拖控件布局的工具)JBuilder,今天上午就下 ...

随机推荐

  1. VB.NET版机房收费系统---导出Excel表格

    datagridview,翻译成中文的意思是数据表格显示,使用DataGridView控件,能够显示和编辑来自不同类型的数据源的表格,将数据绑定到DataGridView控件很easy和直观,大多数情 ...

  2. 〖Groovy〗语言使用贴士(Tips)(转)

    [Groovy]是一门运行在[JVM]之上的动态语言.由[James Strachan]和[Bob McWhirter]于2003年启动开发,之后于2004年3月成为[JSR 241](Java Sp ...

  3. 怎样使用docker不加sudo

    有时候发现docker有的指令必须加sudo才干运行,通过下面三步设置便可不加sudo直接运行docker指令: 1. 假设还没有docker group就加入一个: sudo groupadd do ...

  4. HDU 2829 Lawrence(动态规划-四边形不等式)

    Lawrence Problem Description T. E. Lawrence was a controversial figure during World War I. He was a ...

  5. shiro权限架作战

    shiro框架作为一种特权的开源框架,通过身份验证和授权从具体的业务逻辑分离极大地提高了我们的发展速度,它的易用性使得它越来越受到人们的青睐.上一页ACL架相比,shiro能更easy的实现权限控制, ...

  6. gustafson,Sun-Ni,Amdahl

    gustafson 定律由 John Gustafson首先提出.描述:系统优化某部件所获得的系统性能的改善程度,取决于该部件被使用的频率,或所占总执行时间的比例. Gustafson定理中,加速比与 ...

  7. linux网络编程学习笔记之三 -----多进程并发服务端

    首先是fork()函数.移步APUE 8.3.  比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...

  8. linux下无ifconfig命令

    你不是用root用户运行此命令的吧?这样试试看:$ su - password: 输入root用户口令# ifconfig   还是没有的   用whereis命令找找看:# whereis ifco ...

  9. Android onTouch、OnLongClick、onClick和ScrollView滑动事件冲突

    为了实现近期录制的长按,松开手指,结束录制功能.在项目,难道你去走一走会头晕,书写demo为了下一个梳理. 顺便研究android事件调用机制. 先上效果界面: 布局: <RelativeLay ...

  10. Welcome Docker to SUSE Linux Enterprise Server【水平有限,中英对比,求纠错】

      原文:Welcome Docker to SUSE Linux Enterprise Server Lightweight virtualization is a hot topic these ...