У меня это в нескольких областях приложения, над которым я работаю, и я не вижу возможности воспроизвести его за пределами этого приложения. Я не могу создать sscce, так как мне не удается это вообще воспроизвести. Это заставляет меня думать, что это должно быть что-то, вызванное родительским фреймом/приложением, но я понятия не имею, где искать.Swing Всплывающие меню не полностью окрашены
Что я вижу, так это то, что часть левой панели всплывающих меню не раскрашена. Я вижу это поведение с всплывающими окнами JCombobox, а также с JPopupMenu. Я прикрепил пару изображений, чтобы показать, что я имею в виду. большинство из них правильно работали ранее и без каких-либо изменений в коде, где создаются или отображаются popupmenu, эта проблема распространилась и на многие другие места.
Я не смешиваю тяжеловесные и легкие компоненты, так как мы используем только компоненты Swing, а два примера, которые я показываю ниже, находятся в совершенно разных частях приложения. Первый - на довольно простой панели с очень небольшой функциональностью, но второй пример (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());
}
Вы случайно смешиваете тяжелый вес (AWT) и легкие (Swing) компоненты в одном приложении? –
Или неправильно изменить область отсечения родителя? [Sscce] (http://sscce.org) поможет прояснить ситуацию. – trashgod
Я не смешиваю тяжеловесные и легкие компоненты, так как мы используем только компоненты Swing. Два примера находятся в совершенно разных частях приложения, и я вообще не изменяю область отсечения родителя. Что-то я забыл упомянуть, что эти всплывающие окна создаются и вызываются на EDT. Я не могу создать sscce, так как я не могу воспроизвести это вообще. Это должно быть что-то, вызванное родительским фреймом/приложением, но я понятия не имею, где искать. –