2011-05-06 10 views
2

私はこのアプリをいくつかの分野で使っていますが、私はこのアプリの外でそれを複製する方法がありません。私はこれを全く複製することができないので、sscceを作成することはできません - これは、親フレーム/アプリケーションによって引き起こされたものでなければならないと信じていますが、どこを見てもわかりません。スイングポップアップメニューは完全に塗られていません

私が見ているのは、ポップアップメニューの左側の部分がペイントされていないことです。私はJPopupMenuだけでなく、JComboboxポップアップでこの動作を参照してください。私は何を意味するのかを示すために、いくつかの画像を添付しました。これらのほとんどは以前は正しく動作していたし、ポップアップメニューが作成または表示されたコードに変更を加えることなく、この問題は今や他の多くの場所に広がっている。

スイングコンポーネントのみを使用しているため、重いコンポーネントと軽量コンポーネントが混在しているわけではありません。以下に示す2つの例は、アプリケーションの全く異なる部分です。最初のパネルは非常にシンプルなパネルで機能はほとんどありませんが、2番目の例(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

私はSwingコンポーネントしか使用していないので、重い軽量のコンポーネントは混ぜていません。 2つの例はアプリの全く異なる部分にあり、私は親のクリッピング領域をまったく変更していません。私が言いたいことを忘れてしまったのは、これらのポップアップが作成され、EDTに呼び出されたということです。私はこれを複製することはできないので、私はsscceを作成することはできません。それは親フレーム/アプリケーションによって引き起こされたものでなければなりませんが、私はどこを見てもわかりません。 –

答えて

1

は(偽)JPopupMenu.setDefaultLightWeightPopupEnabledを取り出します。それを固定しました...誰かがなぜその理由を説明してくれますか?

+4

重いポップアップをアクティブにし、軽量コンポーネントと重いコンポーネントを混在させるこの行は、いくつか問題を引き起こす可能性があります。 (ほぼzオーダー関連のもの)期待していることの概要については、http://java.sun.com/products/jfc/tsc/articles/mixing/を参照してください。 –

+0

Daniel Rikowskiさんのコメント用リンクを更新しました。http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html – CleanUp

関連する問題