2

私が取り組んでいるアプリのいくつかの領域にこれがあり、このアプリの外でそれを複製する方法がわかりません. これをまったく複製できないため、sscceを作成できません。これにより、親フレーム/アプリが原因であると思われますが、どこを見ればよいかわかりません。

私が見ているのは、ポップアップ メニューの左側の一部が描画されていないことです。この動作は、JCombobox ポップアップと JPopupMenu で見られます。私が何を意味するかを示すために、いくつかの画像を添付しました。これらのほとんどは、以前は適切に機能していましたが、ポップアップ メニューが作成または表示されるコードを変更しなくても、この問題は他の多くの場所に広がっています。

Swing コンポーネントのみを使用しており、以下に示す 2 つの例はアプリのまったく異なる部分にあるため、重いコンポーネントと軽量なコンポーネントを混在させていません。最初の例は機能がほとんどない単純なパネルですが、2 番目の例 (JPoopupMenu) は非常に複雑な従来のパネルです。

これらの場所と他の場所の両方で、親のクリッピング領域をまったく変更していません。いずれの場合も、これらのポップアップが作成され、EDT に表示されます。

この質問がかなり漠然としていることは承知していますが、それは問題の性質によるものです。要求された情報を提供します。

JComboBox ポップアップの問題 この特定のケースはたまたまカスタム コンボボックス モデルですが、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 ペイントの問題

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

1 に答える 1

2

JPopupMenu.setDefaultLightWeightPopupEnabled(false); を取り出します。修正しました...誰かが理由を説明してみてください。

于 2011-05-06T19:47:30.460 に答える