2017-02-15 2 views
-2

К сожалению, я не изучал Java, я знаю другие языки программирования, за исключением Java.Java, как мне установитьText из JMenuItem из другого класса?

Я знаю, как создать меню и добавить элементы в меню. Я понял это из моих простых базовых java-книг. Однако у меня есть доступ к части программного обеспечения с открытым исходным кодом, и мне нужно сделать некоторые настройки, чтобы он работал для меня, и я застрял. Поэтому я предоставлю код того, что происходит, и предоставим код того, что у меня есть, и, надеюсь, кто-то может заполнить недостающие части и объяснить, как это работает, как они работают.

Код ниже является частью файла, который вызывает TranslatorAction.java. Он вызывает его в строке при создании нового элемента меню. Я полностью понимаю эту часть. Я только разместил этот код, чтобы вы могли видеть, что оператор импорта не импортируется для JMenuItem и что элемент меню добавляется косвенно из вызова menu.add. AdminMenu.add создает элемент меню, создавая объект/класс? с параметрами при новом TranslatorAction

javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import com.bo.actions.TranslatorAction; 
    private void createAdminMenu(JMenuBar menuBar) { 
    JMenu adminMenu = new JMenu(com.POSConstants.ADMIN); 
    adminMenu.add(new TranslatorAction()); 
    menuBar.add(adminMenu); 
    } 

Когда новый TranslatorAction() вызываются из выше для создания нового пункта меню. У меня возникла проблема с доступом к настройке текста для нового JMenuItem. Я знаю, играя с кодом, что линия супер («тест»); устанавливает новый текст JMenuItem. Я хочу иметь возможность установить этот набор в переменную, чтобы его можно было изменить «на лету». Ниже приведен весь файл, который вызывается сверху с помощью adminMenu.add (New TranslatorAction());

TranslatorAction код Java файл

package com.bo.actions; 
    import java.awt.event.ActionEvent; 
    import javax.swing.AbstractAction; 
    import javax.swing.Icon; 
    import javax.swing.JTabbedPane; 
    import com.POSConstants; 
    import com.bo.ui.BackOfficeWindow; 


    public class TranslatorAction extends AbstractAction { 

    public TranslatorAction(){ 
    //I know this sets the JMenuItem to Test. Again no importing of  
    //JMenuItem at all what so ever. But I need to set the JmenuItem 
    //to something on the fly instead of hard coding it. Can anyone 
    //show and explain how to dynamically create/change super("test"), 
    // so that way it is not hard coded? 

    super("Test"); 
    } 

    public TranslatorAction(String name) { 
    super(name); 
    } 

    public TranslatorAction(String name, Icon icon) { 
     super(name, icon); 
    } 

    public void actionPerformed(ActionEvent e) { 
    } 
    } 

Спасибо за время каждый одних за помощь мне. Shawn

+2

Измените свой вопрос, чтобы дать полный пример. В частности, все методы должны быть внутри класса. Вы также должны исправить отступы. –

+0

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

+0

Я прокомментировал код с тем, что я понимаю и что мне нужно изменить. строка super («test»); это то, что мне нужно изменить. Эта строка, которую я знаю, изменяет текст в меню файла. Поэтому, если я изменю его на супер («java»); в меню файла будет java. Мне нужно изменить это динамически. Поэтому я предполагаю, что мне нужно знать не код для его изменения динамически, но что мне нужно сделать для доступа к setText для JMenuItem, который создается из вызова другого класса adminMenu.add (new translatorAction()); –

ответ

0

Вы можете динамически установить текст JMenuItem с помощью метода JMenuItem#setText(String).

Простым решением без использования отдельных классов было бы создать свой собственный JMenuItem, установить его действие с помощью anonymous classes и добавить его в JMenu.

final JMenu menu = new JMenu("Test JMenu"); 
final JMenuItem menuItem = new JMenuItem("Initial Text"); 
menuItem.setAction(new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     menu.setText("Different Text"); 
    } 

}); 
menu.add(menuItem); 

Обратите внимание, что если вы планируете на реализации шаблона MVC (который @MadProgrammer и я очень рекомендую), ваш метод вызова к контроллеру будет в методе actionPerformed(...). Более подробную информацию о шаблоне MVC можно найти в this answer.


Если вы действительно установить на добавление AbstractAction к вашему JMenu, вы будете нуждаться, чтобы добавить способ дать ваш доступ действия к экземпляру JMenuItem он будет добавлен в ,

Вы можете получить это JMenuItem с помощью myJMenu.getItem(menu.getItemCount() - 1). Это получает последние JMenuItem в JMenu. JMenuItem, которые добавляются вместе с JMenu#add(Action a), добавляются в конец JMenu, как указано в документации.

Поскольку нет никакого способа, чтобы получить JMenuItem не создана только после вызова add(Action a), чтобы дать вашему обычаю AbstractAction экземпляра JMenuItem вы можете добавить метод установки (setJMenuItem(JMenuItem item)) к пользовательскому действию.

Мой переработан AbstractAction реализация выглядит следующим образом:

public class CustomAction extends AbstractAction { 

    private JMenuItem item; 

    public CustomAction() { 
     super("Initial Text"); 
    } 

    public void setJMenuItem(JMenuItem item) { 
     this.item = item; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     item.setText("Different Text"); 
    } 

} 

Убедитесь, чтобы установить JMenuItem после добавления действия, потому что в этом случае, если метод actionPerformed(...) называется и item является nullNullPointerException будет отброшен.

final JMenu menu = new JMenu("Test JMenu"); 
final CustomAction action = new CustomAction(); 
menu.add(action); 
action.setJMenuItem(menu.getItem(menu.getItemCount() - 1)); 
+0

Большое вам спасибо. Я попробую. Единственная причина наличия отдельных классов и использования AbstractAction - оставаться в стиле исходного кода. Однако весь исходный код задает текст JMenuItem, вызывая menu.add (новый класс()), а затем в новом классе он создал отображаемый JMenuItem с SUPER («Отображаемое имя элемента меню»). И я много читал в разных книгах, которые у меня есть на java, и все они подробно описывают JMenuItem и классы JMenu, но недостаточно для того, чтобы я мог объединить их. –

+0

2 Книги, которые я изучаю, - это Deitel и Deitel Java. Как программировать обложки Swing и Ivor Horton's Beginning Java 2. Однако ни одна из них не углубляется с некоторыми из вещей, которые мне нужно знать или пытаться понять, например, это , Я знаю, как это сделать без использования отдельных классов, но с сохранением стиля оригинального автора я хочу поддерживать. Если есть какие-либо другие хорошие справочники ресурсов Java или лучше, чем я использую, сообщите мне об этом. –

+0

Не только для меня, но и для других читающих. Как мой первоначальный отдельный файл класса не импортирует JMenuItem, я предполагаю, что мне нужно импортировать это для этого? Когда я компилирую, я получаю сообщение об ошибке. НЕ МОЖЕТ НАЙТИ СИМВОЛ JMenuItem. –

Смежные вопросы