开发者

Swing Popup menus are not completely painted

开发者 https://www.devze.com 2023-03-04 00:47 出处:网络
I have this in several areas of an app I\'m working on and I can see no way to replicate it outside of this app. I can\'t create a sscce since I can\'t manage to replicate this at all - This leads me

I have this in several areas of an app I'm working on and I can see no way to replicate it outside of this app. I can't create a sscce since I can't manage to replicate this at all - This leads me to believe that it must be something caused by the parent frame / app, but I have no idea where to look.

What I see is that part of the left hand side of popup menus are not painted. I see this behaviour with JCombobox popups as well as JPopupMenu's. I've attached a couple of images to show what I mean. most of these did work properly previously and without any changes to the code where the popupmenu's are created or displayed, this problem has spread to a lot of other places now.

I'm not mixing heavyweight and lightweight components, as we only use Swing components and the two examples I show below are in completely different parts of the app. The first one is in a fairly simple panel with very little functionality, but the second example (JPoopupMenu) is in a very complex legacy panel.

On both of these and other place where I see it, I'm not altering the parent's clipping region at all and in all case, these popups are constructed and displayed on the EDT.

I know this question is rather vague, but that is because of the nature of the problem. I'll provide any requested info.

Swing Popup menus are not completely painted

This specific case happens to be a custom combobox model, but we've seen it when using the DefaultComboBoxModel as well:

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

This is a JPopupMenu that gets displayed when you right click using the following code:

Swing Popup menus are not completely painted

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


Taking out JPopupMenu.setDefaultLightWeightPopupEnabled(false); fixed it... Can somebody please try and explain why?

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号