Swing Popup菜单未完全绘制

时间:2011-05-06 18:07:45

标签: java swing jcombobox jpopupmenu

我在我正在处理的应用程序的几个区域中有这个,我看不到在这个应用程序之外复制它的方法。我无法创建一个sscce,因为我根本无法复制它 - 这让我相信它必须是由父框架/应用程序引起的,但我不知道在哪里看。

我看到的是弹出菜单左侧的部分未绘制。我看到JCombobox弹出窗口以及JPopupMenu的这种行为。我附上了几张图片来展示我的意思。其中大部分都是以前正常工作,并且没有对创建或显示弹出菜单的代码进行任何更改,现在这个问题已经蔓延到很多其他地方。

我没有混合使用重量级和轻量级组件,因为我们只使用Swing组件,下面显示的两个示例位于应用程序的完全不同的部分。第一个是功能非常简单的面板,但第二个例子(JPoopupMenu)是一个非常复杂的传统面板。

在我看到的这些和其他地方,我根本没有改变父母的剪辑区域,并且在所有情况下,这些弹出窗口都是在EDT上构建和显示的。

我知道这个问题很模糊,但那是因为问题的本质。我会提供任何要求的信息。

JComboBox popup issue 这个特定情况恰好是一个自定义组合框模型,但我们在使用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: JPopupMenu paint problem

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() );
                            }

1 个答案:

答案 0 :(得分:1)

取出JPopupMenu.setDefaultLightWeightPopupEnabled(false);修好了......有人可以试着解释一下原因吗?