Список JComboBox DropDown не отображается

это может быть дубликатом не отображаемого всплывающего меню JComboBox , но поскольку это довольно старый вопрос и не был активен в течение достаточно долгого времени, плюс все ответы не были решениями, которые помогли с моей проблемой. Поэтому я решил создать новый вопрос.

Проблема в следующем: я получил заявку от предыдущей коллегии, которая больше не работает в моей компании. Теперь я попытался добавить JComboBox в JPanel. JCombobox отображается, как и ожидалось, но ведет себя так же, как описано Сетом в его вопросе:

1) Первый щелчок по кнопке расширения ничего не дает. Второй щелчок выделяет содержимое окна, но всплывающее окно все еще не появляется.

2) После того, как я нажал кнопку и перевел на нее фокус, нажатия клавиш вверх/вниз проходят по записям правильно.

Я разбил код на то, что, по моему мнению, является минимумом необходимого программирования, чтобы возникла проблема. (В одном из комментариев в упомянутом вопросе упоминалось о предоставлении SSCCE, чего никогда не было).

Теперь вот код, который я могу предоставить:

public static class CreateProjectDialog extends JFrame {

private Dimension size = Toolkit.getDefaultToolkit().getScreenSize();

public CreateProjectDialog() {

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    int SZ_INCR = 1;

    // Passe Fontgröße an Resolution an:
    if (size.width > 1920) {
        SZ_INCR = 2;
    }

    // Initialize Glass Layer
    final JPanel panelGlass = (JPanel) getGlassPane();
    panelGlass.setLayout(null);
    panelGlass.setVisible(true);

    private static JPanel licBorrowPanel = null;

    licBorrowPanel = new JPanel();
    licBorrowPanel.setBounds(0, 20, 1000, 500);
    licBorrowPanel.setVisible(false);
    licBorrowPanel.setBackground(Color.WHITE);
    panelGlass.add(licBorrowPanel);
}

public static void main(String[] args) {
    hauptFrame = new CreateProjectDialog();
}

public static void licenceBorrowDialog() {

    int mainWidth = hauptFrame.getSize().width;
    int mainHeight = hauptFrame.getSize().height;

    // pick a Date
    JComboBox dayList = new JComboBox();
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    Calendar calToday = Calendar.getInstance();
    Date dayToday = calToday.getTime();
    int weekDay = calToday.get(Calendar.DAY_OF_WEEK);
    String weekDayName = "";
    for (int i = 1; i <= 22; i++){
        dayToday.setDate(dayToday.getDate()+1);
        weekDay = dayToday.getDay();
        weekDayName = translateWeekDay(weekDay);
        dayList.addItem(i + " day(s) until " + weekDayName + " " + df.format(dayToday));
    }
    dayList.setOpaque(true);
    dayList.setSelectedIndex(2);
    dayList.setBounds(mainWidth / 2 - (125*SZ_INCR), (165*SZ_INCR), (250*SZ_INCR), (100*SZ_INCR));
    licBorrowPanel.add(dayList);

    dayList.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            int numberOfDays;
            JComboBox dl = (JComboBox)e.getSource();
            numberOfDays = dl.getSelectedIndex()+1;
            labelSelectedDate.setText("<HTML><BODY><b>Count of days: </b>" + numberOfDays + "</HTML></BODY>");
        }
    });
}

//Translate weekday int to name
public static String translateWeekDay(int day){
    String retDay;
    switch (day) {
        case 0:  retDay = "Monday";
            break;
        case 1:  retDay = "Truesday";
            break;
        case 2:  retDay = "Wednesday";
            break;
        case 3:  retDay = "Thursday";
            break;
        case 4:  retDay = "Friday";
            break;
        case 5:  retDay = "Saturday";
            break;
        case 6:  retDay = "Sunday";
            break;
        default: retDay = "Invalid day";
            break;
    }
    return retDay;
}
}

Я попытался заполнить больше элементов (как это было предложено jluzwick), чтобы увидеть, скрыт ли раскрывающийся список просто за чем-либо, но нет.

Я определенно никогда не использовал getRootPane() вместо getContentPane(), как подозревал Сехтим.

Существует также JCombobox не отображается , где принятым ответом является установка setVisible(true) до конца конструктора. Я попробовал это, и это не изменило никакого поведения в моем случае.

Вопрос, на который мне нужен ответ, заключается в следующем: как сделать раскрывающийся список видимым, чтобы пользователь мог легко выбрать запись?


person Reatus    schedule 07.04.2017    source источник
comment
Вы захотите исправить свой код, потому что он не скомпилируется   -  person MadProgrammer    schedule 07.04.2017


Ответы (1)


Спасибо MadProgrammer за подсказку относительно того, что код не компилируется — я нашел решение и предоставлю его здесь всем, у кого есть похожая проблема.

Проблема возникла в результате смешивания тяжеловесных и легковесных компонентов (awt/swing).

Это привело к использованию легкого всплывающего окна, которое затем, вероятно, было закрыто другими компонентами и, следовательно, не было видно.

Решение (если сочетание тяжелого и легкого веса должно оставаться) состоит в том, чтобы отключить всплывающее окно легкого веса, заставляя приложение использовать всплывающее окно резервного копирования. Это делается путем замены следующей строки:

dayList.setSelectedIndex(2);

С помощью этой строки:

dayList.setLightWeightPopupEnabled (false);

Я нашел решение здесь: http://de.comp.lang.java.narkive.com/t2GPS9vy/jcombobox-poppt-nicht-auf

person Reatus    schedule 24.04.2017
comment
Это сделало это и для меня. В моем случае это не было проблемой смешивания тяжелого и легкого, а мои триггерные компоненты были в стеклянной панели, которая отображается выше легкого всплывающего слоя. Пока всплывающее меню достаточно маленькое, чтобы поместиться на большую панель, по умолчанию оно будет легким и, следовательно, всегда будет позади. Принуждение всплывающего окна к тому, чтобы оно всегда было тяжелым, означает, что оно всегда будет отображаться в своем собственном маленьком мире. - person Ti Strga; 05.12.2019