как добавить список действий в jmenuitem

1
  1. В моем пункте меню добавлена база данных thorugh.
  2. я должен выполнить действие, такое как открытие нового jframe, если пользователь выбирает конкретный элемент меню.
  3. Здесь размер меню добавляется в меню, и под ним добавляются различные пункты меню, такие как Period, Entity, которые извлекаются из базы данных.
  4. Теперь я хочу открыть новый jframe при щелчке элемента меню Period.

         public  void MenuExp(){
               JMenu DimensionMenu = new JMenu("Dimension");
               JMenu editMenu = new JMenu("Help");
               jMenuBar1.add(DimensionMenu);
               jMenuBar1.add(editMenu);
    
        //JMenuItem newAction = new JMenuItem("Account");
        //fileMenu.add(newAction);
        //JMenuItem newPeriod = new JMenuItem("Period");
        //fileMenu.add(newPeriod);
    
        try{
             Class.forName("oracle.jdbc.OracleDriver");
             Connection comm = (Connection)DriverManager.getConnection("jdbc:oracle:thin:@192.168.100.25:1521:orcl","SYSTEM","Admin123");
             Statement st = comm.createStatement();
             String Query = "select OBJECT_NAME from RAHUL_APP1.HSP_OBJECT where OBJECT_TYPE = 2 AND OBJECT_ID <> 30" ;
             //and User_Name ='" + jTextField1.getText()+"'";
             ResultSet rs = st.executeQuery(Query);
    
             while(rs.next()){ 
                    JMenuItem newAction = new JMenuItem(rs.getString(1));
                    DimensionMenu.add(newAction); 
    
                   rs.close();
                   st.close();
                   comm.close(); 
                   newAction.addActionListener(new ActionListener(){
                          public void actionPerformed(ActionEvent arg0){
                             System.out.println("You have clicked on the Account");
                          }
                   });
              }
            } catch(Exception e){
                  JOptionPane.showMessageDialog(this,e);
            }   
        }
    
  • 0
    Мой пункт меню добавляется в базу данных Почему? Это особенность "настроить свое меню"? С другой стороны, вы можете сохранить уникальную команду действия для каждого элемента меню и вернуть ее обратно к элементу меню так же, как вы устанавливаете его текст. Затем создайте универсальный прослушиватель действий, который выполняет различные действия в зависимости от команды действия источника, и прикрепите его к каждому пункту меню. Это, вероятно, будет достаточно, но кажется немного грязным.
  • 0
    Да, это меню для настройки, потому что приложение будет связано с различными таблицами, каждый раз, когда таблица меняется, меню будет меняться
Показать ещё 1 комментарий
Теги:
swing
jtable
jmenuitem

3 ответа

2

Вам нужно выполнить некоторую параметризацию фрейма или иметь, например, класс фрейма, который также хранится в БД, и инициализировать его с помощью рефлексии...


Обновить:

Реализация может быть такой:

package betlista.so.swing.menuitemdialogsfromdb;

import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MainFrame extends JFrame {

    public MainFrame() {
        super("Frame");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        add(createMenu());

        pack();
    }

    private JMenuBar createMenu() {
        JMenuBar menuBar = new JMenuBar();

        JMenu menu = new JMenu("Open");
        menu.add(new DialogCreatingMenuItem("Dialog 1", "betlista.so.swing.menuitemdialogsfromdb.MainFrame$MyDialog1"));
        menu.add(new DialogCreatingMenuItem("Dialog 2", "betlista.so.swing.menuitemdialogsfromdb.MainFrame$MyDialog2"));

        menuBar.add(menu);

        return menuBar;
    }

    class DialogCreatingMenuItem extends JMenuItem implements ActionListener {

        String className;

        public DialogCreatingMenuItem(String text, String className) throws HeadlessException {
            super(text);
            this.className = className;
            addActionListener(this);
        }

        @Override
        public void actionPerformed(ActionEvent ae) {
            try {
                Class<JDialog> clazz = (Class<JDialog>)Class.forName(this.className);
                JDialog dialog = clazz.newInstance();
                dialog.setVisible(true);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

    }

    public static class MyDialog1 extends JDialog {
        public MyDialog1() {
            setTitle("Dialog 1");
            add(new JLabel("Dialog 1"));
            pack();
        }
    }

    public static class MyDialog2 extends JDialog {
        public MyDialog2() {
            setTitle("Dialog 2");
            add(new JLabel("Dialog 2"));
            pack();
        }       
    }

    public static void main(String[] args) {
        new MainFrame().setVisible(true);
    }

}

где Строки в

    menu.add(new DialogCreatingMenuItem("Dialog 1", "betlista.so.swing.menuitemdialogsfromdb.MainFrame$MyDialog1"));
    menu.add(new DialogCreatingMenuItem("Dialog 2", "betlista.so.swing.menuitemdialogsfromdb.MainFrame$MyDialog2"));

извлекаются из базы данных...

  • 0
    видите, я не могу понять, как мне сравнить значение JMenuItem, как он добавляется из базы данных
  • 1
    Я добавил пример реализации, конечно, в более изощренном примере диалоговые классы могут быть в другом файле, также в другом проекте (но они должны быть в classpath).
1

Теперь я хочу открыть новый jframe при нажатии элемента меню Period

Конечно, вы должны добавить ActionListener в свое меню, чтобы сделать это, но реальный вопрос: как вы определяете правильного слушателя для каждого пункта меню? Поскольку вы получаете свои пункты меню из базы данных, тогда это не так просто, как кажется.

Примечание: см . Использование нескольких JFrames, Хорошая/Плохая Практика?


Вариант 1 (вид грязного)

Как я уже сказал, вы можете сохранить команду действия и установить ее обратно в пункт меню так же, как вы установили имя меню:

while(rs.next()) { 
    String menuName =  rs.getString("menuname");
    String actionCommand = rs.getString("actioncommand");
    JMenuItem newAction = new JMenuItem(menuName);
    newAction.setActionCommand(actionCommand);
    DimensionMenu.add(newAction);
    ...
}

Затем вы можете иметь слушателя, который использует ActionEvent # getActionCommand(), чтобы решить правильное действие для выполнения и присоединить этот прослушиватель ко всем вашим пунктам меню:

class MenuActionListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent evt) {
        String actionCommand = evt.getActionCommand();
        switch (actionCommand) {
            case "OpenNewDialog": openNewDialog(); break;
            ...
        }
    }

    private void openNewDialog() {
        // implementation here
    }
}

Затем:

ActionListener listener = new MenuActionListener();

while(rs.next()) { 
    String menuName =  rs.getString("menuname");
    String actionCommand = rs.getString("actioncommand");
    JMenuItem newAction = new JMenuItem(menuName);
    newAction.setActionCommand(actionCommand);
    newAction.addActionListener(listener);
    DimensionMenu.add(newAction);
    ...
}

Вариант 2

Реализовать шаблон фабричного метода для создания определенного ActionListener или Action на основе команды действия меню:

class ActionListenerFactory {

    public static Action createAction(final String actionCommand) {
        switch (actionCommand) {
            case "OpenNewDialog": return openNewDialogAction(); break;
            ...
        }
    }

    private Action openNewDialogAction() {
        Action action = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                // open new dialog here
            }
        };
        return action;
    }
}

Затем:

while(rs.next()) {
    String menuName =  rs.getString("menuname");
    String actionCommand = rs.getString("actioncommand");
    JMenuItem newAction = new JMenuItem(menuName);
    newAction.setActionCommand(actionCommand);
    newAction.addActionListener(ActionListenerFactory.createAction(actionCommand));
    DimensionMenu.add(newAction);
    ...
}

Смотрите также:

1

Вот пример кода:

menuItem1.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    ...
                }
            });

Помните о шагах по созданию меню: 1. Создайте MenuBar и добавьте его на панель. 2. Создайте меню и добавьте в MenuBar. 3. Создайте MenuItem и добавьте в меню

Затем добавьте слушателя в MenuItem

Изменение: если вы используете его вне инструкции try, он должен работать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню