私が取り組んでいるアプリのいくつかの領域にこれがあり、このアプリの外でそれを複製する方法がわかりません. これをまったく複製できないため、sscceを作成できません。これにより、親フレーム/アプリが原因であると思われますが、どこを見ればよいかわかりません。
私が見ているのは、ポップアップ メニューの左側の一部が描画されていないことです。この動作は、JCombobox ポップアップと JPopupMenu で見られます。私が何を意味するかを示すために、いくつかの画像を添付しました。これらのほとんどは、以前は適切に機能していましたが、ポップアップ メニューが作成または表示されるコードを変更しなくても、この問題は他の多くの場所に広がっています。
Swing コンポーネントのみを使用しており、以下に示す 2 つの例はアプリのまったく異なる部分にあるため、重いコンポーネントと軽量なコンポーネントを混在させていません。最初の例は機能がほとんどない単純なパネルですが、2 番目の例 (JPoopupMenu) は非常に複雑な従来のパネルです。
これらの場所と他の場所の両方で、親のクリッピング領域をまったく変更していません。いずれの場合も、これらのポップアップが作成され、EDT に表示されます。
この質問がかなり漠然としていることは承知していますが、それは問題の性質によるものです。要求された情報を提供します。
この特定のケースはたまたまカスタム コンボボックス モデルですが、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 です。
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() );
}