У меня есть приложение 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 передает значение .