2011-05-06 3 views
2

У меня это в нескольких областях приложения, над которым я работаю, и я не вижу возможности воспроизвести его за пределами этого приложения. Я не могу создать sscce, так как мне не удается это вообще воспроизвести. Это заставляет меня думать, что это должно быть что-то, вызванное родительским фреймом/приложением, но я понятия не имею, где искать.Swing Всплывающие меню не полностью окрашены

Что я вижу, так это то, что часть левой панели всплывающих меню не раскрашена. Я вижу это поведение с всплывающими окнами JCombobox, а также с JPopupMenu. Я прикрепил пару изображений, чтобы показать, что я имею в виду. большинство из них правильно работали ранее и без каких-либо изменений в коде, где создаются или отображаются popupmenu, эта проблема распространилась и на многие другие места.

Я не смешиваю тяжеловесные и легкие компоненты, так как мы используем только компоненты Swing, а два примера, которые я показываю ниже, находятся в совершенно разных частях приложения. Первый - на довольно простой панели с очень небольшой функциональностью, но второй пример (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. Два примера находятся в совершенно разных частях приложения, и я вообще не изменяю область отсечения родителя. Что-то я забыл упомянуть, что эти всплывающие окна создаются и вызываются на EDT. Я не могу создать sscce, так как я не могу воспроизвести это вообще. Это должно быть что-то, вызванное родительским фреймом/приложением, но я понятия не имею, где искать. –

ответ

1

Вынув JPopupMenu.setDefaultLightWeightPopupEnabled (ложь); исправлено ... Может кто-нибудь, пожалуйста, попытайтесь объяснить, почему?

+4

Эта линия активирует всплески тяжелого веса и смешивание легких и тяжелых компонентов может привести к некоторым проблемам. (В основном материал, связанный с z-порядком) См. Http://java.sun.com/products/jfc/tsc/articles/mixing/ для обзора вещей, которые нужно ожидать. –

+0

Обновленная ссылка для комментария Даниэля Риковски: http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html – CleanUp