【问题标题】:JComboBox DropDown list is not displayedJComboBox DropDown 列表不显示
【发布时间】:2017-09-02 17:43:26
【问题描述】:

这可能是 JComboBox popup menu not appearing 的副本,但由于它是一个相当古老的问题并且在很长一段时间内都没有活跃,而且所有答案都不是解决方案,这有助于解决我的问题。因此我决定创建一个新问题。

问题如下: 我收到了以前的同事的申请,这在我的公司不再工作了。现在我尝试将 JComboBox 添加到 JPanel。 JCombobox 按预期显示,但其行为方式与 Seth 在他的问题中描述的方式相同:

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 建议的那样)以查看 DropDown 是否只是隐藏在任何东西后面,但没有。

我绝对没有使用 getRootPane() 代替 getContentPane(),正如 Sehtim 所怀疑的那样。

还有 JCombobox is not displayed ,其中接受的答案是将 setVisible(true) 设置为构造函数的末尾。我试过了,它并没有改变我的任何行为。

我需要回答的问题是:如何使下拉列表可见,以便用户轻松选择条目?

【问题讨论】:

  • 你要修复你的代码,因为它不会编译

标签: java jcombobox swingx


【解决方案1】:

感谢 MadProgrammer 提供有关代码未编译的提示 - 我找到了解决方案,并将在此处为遇到类似问题的任何人提供解决方案。

问题是由于混合了重量级和重量轻的组件(awt / swing)。

这导致使用轻量级弹出窗口,然后可能被其他组件遮挡,因此不可见。

解决方案(如果必须保留重载和轻量级的混合)是禁用轻量级弹出窗口,强制应用程序使用备份弹出窗口。这是通过替换以下行来完成的:

dayList.setSelectedIndex(2);

用这一行:

dayList.setLightWeightPopupEnabled (false);

我在这里找到了解决方案: http://de.comp.lang.java.narkive.com/t2GPS9vy/jcombobox-poppt-nicht-auf

【讨论】:

  • 这也为我做了。在我的情况下,混合重量级和轻量级不是问题,而是我的触发组件位于玻璃窗格中 - 它显示为比轻量级弹出层“更高”。只要弹出菜单足够小以适合较大的面板,它就会默认为轻量级,因此总是“落后”。强制弹出始终是重量级的意味着它将始终显示在其“自己的”小世界中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多