NetBeans 9.0: добавление меню RadioButton - PullRequest
0 голосов
/ 03 октября 2018

У меня есть приложение NetBeans (использующее NB 9.0), в котором мне нужно создать меню переключателей.Я тщательно обыскал Stack Overflow и другие места (используя обычные поисковые системы) без удачи.Я застрял.

Я нашел примеры того, как это сделать, когда я создаю все меню из моей программы.(https://docs.oracle.com/javase/tutorial/uiswing/components/menu.html) Однако я пытаюсь сделать это с помощью модулей. Должен быть способ сделать это, поскольку, когда я использую Design, у меня есть возможность добавить «Пункт меню / RadioButton». Попытка добавить их вокно моего модуля добавляет его в окно «Прочие компоненты - навигатор», но его нигде нет в меню, когда я его запускаю.

Самое близкое, что мне удалось открыть, - это создать пункты меню с «Новый-> Действие ", затем установите значок и текст переключателя и кнопки. Однако, когда вызывается действие, я не знаю, как получить доступ к меню для изменения значка (чтобы можно было смоделировать переключатель).

Отредактировано 9 октября 2018 :

Более подробно о том, что я делаю. Следующий код автоматически генерируется при создании пункта меню с его действием:

@ActionID(
    category = "Build",
    id = "org.nonprofit.project"
)
@ActionRegistration(
    iconBase = "org/nonprofit/project/RadioButtonUnselected.png",
    displayName = "#CTL_MenuLogLevelDebug"
)
@ActionReference(path = "Menu/Options/Log Level", position = 5000)
@Messages("CTL_MenuLogLevelDebug=Debug")
public final class MenuLogLevelDebug implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO implement action body
    }
}

Я хочу иметь возможность получить доступ к базовому JMenu, чтобы я мог изменить текст и / или значок для этого пункта меню и его братьев и сестер. Я искал с тех пор до моего исходного поста, без помощи я могу найти в Интернете.

Отредактировано 11 октября 2018 :

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

public final class MenuLogLevelAll implements ActionListener {
    static public ButtonGroup group = null;

    @Override
    public void actionPerformed(ActionEvent e) {
        MenuLogLevelAll.changeLogLevelMenu(e);
    }

    static public void actionFatal  (ActionEvent e) { }
    static public void actionError  (ActionEvent e) { }
    static public void actionWarning(ActionEvent e) { }
    static public void actionInfo   (ActionEvent e) { }
    static public void actionDebug  (ActionEvent e) { }
    static public void actionTrace  (ActionEvent e) { }
    static public void actionAll    (ActionEvent e) { }

    static public void changeLogLevelMenu(ActionEvent e) {
        MenuItem   source   = (MenuItem)e.getSource();
        String     menuText = source.getText();
        JPopupMenu parent   = (JPopupMenu)(source.getParent());

        parent.removeAll();
        group = newButtonGroup();
        String[] newText = {"Fatal", "Error", "Warning", "Info", "Debug", "Trace", "All"};
        ActionListener[] actions = {
            new ActionListener() { @Override public void actionPerformed(ActionEvent e) { actionFatal  (e); } },
            new ActionListener() { @Override public void actionPerformed(ActionEvent e) { actionError  (e); } },
            new ActionListener() { @Override public void actionPerformed(ActionEvent e) { actionWarning(e); } },
            new ActionListener() { @Override public void actionPerformed(ActionEvent e) { actionInfo   (e); } },
            new ActionListener() { @Override public void actionPerformed(ActionEvent e) { actionDebug  (e); } },
            new ActionListener() { @Override public void actionPerformed(ActionEvent e) { actionTrace  (e); } },
            new ActionListener() { @Override public void actionPerformed(ActionEvent e) { actionAll    (e); } } };

        int index = 0;
        for(String text : newText) {
            JRadioButtonMenuItem radiomenu = new JRadioButtonMenuItem(text);
            ActionListener action = actions[index++];
            radiomenu.addActionListener( action );
            group .add(radiomenu);
            parent.add(radiomenu);
            if(text.equals(menuText)) {
                radiomenu.setSelected(true);  // Select the item just selected
                action.actionPerformed(e);    // Call the real action (to avoid duplicate code)
            }
        }
    }
}

В каждом из actionPerformed () для каждого из других пунктов меню они идентичны actionPerformed (), показанному выше.Ни один другой код не используется в этих других классах пунктов меню.Например, вот один из них:

public final class MenuLogLevelError implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        MenuLogLevelAll.changeLogLevelMenu(e);
    }
}

К вашему сведению: я пытался изменить значок и текст каждого элемента меню через «Источник MenuItem», чтобы продолжить имитацию переключателей.Однако это не изменило фактический значок и текст, потому что Java передает значение .

...