2011-05-06 9 views
2

제가 작업하고있는 앱의 여러 영역에이 기능이 있으며이 앱 외부에서 복제 할 방법이 없습니다. 나는 이것을 전혀 복제 할 수 없기 때문에 sscce를 만들 수 없다 - 이것은 부모 프레임/앱에 의해 야기 된 것이어야한다고 생각하지만, 어디서 볼 것인지 전혀 모른다.스윙 팝업 메뉴가 완전히 그려지지 않았습니다

내가 보는 것은 팝업 메뉴의 왼쪽 부분이 칠해지지 않은 부분입니다. JPopupMenu뿐만 아니라 JCombobox 팝업에서도이 동작을 볼 수 있습니다. 내가 의미하는 바를 보여주기 위해 몇 가지 이미지를 첨부했습니다. 이들 중 대부분은 이전에 제대로 작동했고 팝업 메뉴가 생성되거나 표시되는 코드를 변경하지 않고도이 문제가 많은 다른 곳으로 확산되었습니다.

우리는 스윙 구성 요소만을 사용하기 때문에 헤비급 및 경량 구성 요소는 혼합하지 않습니다. 아래에 나와있는 두 가지 예는 앱의 완전히 다른 부분에 있습니다. 첫 번째 패널은 기능이 거의없는 매우 단순한 패널이지만 두 번째 예제 (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()); 
          } 
+2

동일한 응용 프로그램에서 중량 (AWT)과 경량 (Swing) 구성 요소를 우연히 혼합 하시겠습니까? –

+1

부모의 클리핑 영역을 부적절하게 변경 하시겠습니까? [sscce] (http://sscce.org)는 사물을 명확히하는 데 도움이됩니다. – trashgod

+0

스윙 구성 요소 만 사용하기 때문에 중량급 및 경량 구성 요소를 혼합하지 않습니다. 두 예제는 앱의 완전히 다른 부분에 있으며 부모의 클리핑 영역을 전혀 변경하지 않습니다. 내가 언급 한 것을 잊어 버린 점은 이러한 팝업이 EDT에서 만들어지고 호출된다는 것입니다. 나는 이것을 복제 할 수 없기 때문에 sscce를 만들 수 없다. 부모 프레임/앱에 의해 발생한 것이어야하지만 어디를 봐야할지 모릅니다. –

답변

1

는 (false)를 JPopupMenu.setDefaultLightWeightPopupEnabled을 복용; 그것을 고쳤습니다 ... 누군가가 시도해보고 이유를 설명해 줄 수 있습니까?

+4

이 라인 활성화 헤비급 팝업 및 경량 및 중량 구성 요소를 혼합하면 몇 가지 문제가 발생할 수 있습니다. (대부분 z-order 관련) http://java.sun.com/products/jfc/tsc/articles/mixing/에서 기대할 수있는 것들의 개요를 볼 수있다. –

+0

Daniel Rikowski의 코멘트 링크가 업데이트되었습니다. http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html – CleanUp

관련 문제