Как я могу создать меню “Drop-Down” на панели инструментов Java Swing?

Моя первоначальная реакция была #ifdef, конечно , но я думаю #if, на самом деле имеет некоторые значительные преимущества для этого - вот то, почему:

Первый, можно использовать DEBUG_ENABLED в препроцессоре и скомпилированные тесты. Пример - Часто, я хочу более долгие тайм-ауты, когда отладка включена, таким образом с помощью #if, я могу записать это

  DoSomethingSlowWithTimeout(DEBUG_ENABLED? 5000 : 1000);

... вместо...

#ifdef DEBUG_MODE
  DoSomethingSlowWithTimeout(5000);
#else
  DoSomethingSlowWithTimeout(1000);
#endif
1120-секундный, Вы находитесь в лучшем положении, если Вы хотите мигрировать от #define к глобальной константе. #define с обычно осуждаются большинством программистов на C++.

И, В-третьих, Вы говорите, что у Вас есть деление в Вашей команде. Мое предположение, это означает, что различные участники уже приняли разные подходы, и необходимо стандартизировать. Управление, которое #if является предпочтительным вариантом, означает, что код с помощью [1 111] будет компилировать - и работать - даже когда DEBUG_ENABLED ложь. И очень легче разыскать и удалить вывод отладки, который производится, когда это не должно быть, чем наоборот.

, О, и незначительная точка удобочитаемости. Необходимо быть в состоянии использовать истинный/ложный, а не 0/1 в Вашем #define, и потому что значение является единственной лексемой, это - одно время, Вам не нужны круглые скобки вокруг этого.

#define DEBUG_ENABLED true

вместо [1 123]

#define DEBUG_ENABLED (1)
9
задан Steve McLeod 14 December 2009 в 01:13
поделиться

4 ответа

Well, here is a potential solution that is not without it's drawbacks. Only you can decide if this is acceptable for your application. The issue is that the popup closing occurs before other mouse-handling events are fired so clicking on your More.. button again causes the popup to hide, thus resetting the buttons state to deselected BEFORE the button even gets told it was pressed.

The easy workaround is to add the following call within your main program:

UIManager.put("PopupMenu.consumeEventOnClose", Boolean.TRUE);

The result of this is that whenever a popup menu is closed because of a mouse-pressed event, that mouse event will be consumed at the time the menu is closed and won't be passed on to any other components under the mouse. If you can live with limitation, this is an easy solution.

5
ответ дан 3 November 2019 в 07:13
поделиться

Я не использую Firefox, поэтому я не знаю, как выглядит кнопка Smart Bookmarks, но, возможно, использую JMenu в качестве «кнопки». Вы можете попробовать использовать границу JButton, чтобы она больше походила на кнопку.

0
ответ дан 3 November 2019 в 07:13
поделиться

Ну, слушатель на кнопке реагирует только тогда, когда он сдвигается вниз, потому что вы слушаете только события ItemEvent.SELECTED . Как насчет добавления еще одного предложения if для прослушивания событий ItemEvent.DESELECTED здесь:

    moreButton.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                createAndShowMenu((JComponent) e.getSource(), moreButton);
            }
        }
    });

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

-1
ответ дан 3 November 2019 в 07:13
поделиться

What's happening is that when you click off the menu, it cancels the popup menu, so you deselect the button, but the next immediate event is clicking the button, and now its deselected so it shows the menu again.

I don't have the exact solution yet, but give me a little bit ...

1
ответ дан 3 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: