我在我正在开发的应用程序的几个领域都有这个,我看不出有办法在这个应用程序之外复制它。我无法创建 sscce,因为我根本无法复制它 - 这让我相信它一定是由父框架/应用程序引起的,但我不知道在哪里看。
我看到的是弹出菜单左侧的部分没有绘制。我在 JCombobox 弹出窗口和 JPopupMenu 中看到了这种行为。我附上了几张图片来说明我的意思。其中大多数以前都可以正常工作,并且没有对创建或显示弹出菜单的代码进行任何更改,这个问题现在已经蔓延到很多其他地方。
我没有混合使用重量级和轻量级组件,因为我们只使用 Swing 组件,并且我在下面展示的两个示例位于应用程序的完全不同的部分。第一个是在一个相当简单的面板中,功能很少,但第二个例子(JPoopupMenu)是在一个非常复杂的遗留面板中。
在我看到的这两个地方和其他地方,我根本没有改变父母的剪辑区域,在所有情况下,这些弹出窗口都是在 EDT 上构建和显示的。
我知道这个问题相当模糊,但这是因为问题的性质。我会提供任何要求的信息。
这个特定的案例恰好是一个自定义的组合框模型,但是我们在使用 DefaultComboBoxModel 时也看到了它:
public class GroupListModel extends AbstractListModel
implements ComboBoxModel{
private List<groupObject> groups;
private groupObject selectedItem = null;
public GroupListModel() {
this(new ArrayList<groupObject>());
}
public GroupListModel(List<groupObject> groups) {
this.groups = groups;
}
@Override
public int getSize() {
return groups.size();
}
@Override
public Object getElementAt(int index) {
if(index>=groups.size()){
throw new IndexOutOfBoundsException();
}
return groups.get(index);
}
public void setGroups(List<groupObject> groups){
this.groups = groups;
fireContentsChanged(this, 0, groups.size());
}
public void addElement(groupObject group){
groups.add(group);
fireIntervalAdded(this, groups.size()-1, groups.size()-1);
}
public void addElement(groupObject group, int index){
groups.add(index, group);
fireIntervalAdded(this, index, index+1);
}
@Override
public void setSelectedItem(Object anItem) {
if(anItem instanceof groupObject){
selectedItem = (groupObject) anItem;
}else{
throw new IllegalArgumentException();
}
fireContentsChanged(this, 0, groups.size());
}
@Override
public Object getSelectedItem() {
return selectedItem;
}
这是一个 JPopupMenu,当您使用以下代码右键单击时会显示该菜单:
public void mouseClicked(MouseEvent e) {
if( e.getButton()==e.BUTTON3 ){
lastClickedID = tmp.getUniqueID();
lastClickedGui = (bigEventGui) gui;
itmComplete.setText(
completed ?
ctOne.getLang("uncomplete") :
ctOne.getLang("complete") );
itmComplete.setIcon( (completed ?
iconFramework.getIcon(
iconFramework.UNCOMPLETE_ITEM,
24, false) :
iconFramework.getIcon(
iconFramework.COMPLETE_ITEM,
24, false) ));
popRCEvent.show(gui, e.getX(), e.getY() );
}