Components de um JFrame devem poder ser vistos por toda a interface?

Fala Pessoal,

estou com uma dúvida uma dúvida a respeito do projeto de GUI’s Swing em Java.

Tenho uma aplicação cujo frame principal é um JInternalFrame que possui um JMenuBar com diversas opções.
Obviamente, uma vez acionados qualquer uma destas opções um evento é gerado. Estes eventos são tratados no método actionPerformed(ActionEvent e). Até aí tudo bem. O problema é que o meu JInternalFrame deve ter como atributos TODOS os seus components, para que eu possa reconhecer a fonte do evento através de e.getSource().

Sendo assim, se o meu JInternalFrame tem, por exemplo, 25 JMenu’s cada um com 37 opções temos uma classe com 25x37 atributos, no mínimo ? Isso não me parece Java bem escrito !

Alguém tem uma alternativa inteligente para contornar este problema ?

[]'s,
Rafael March.

[quote=rafaelmarch]Fala Pessoal,

estou com uma dúvida uma dúvida a respeito do projeto de GUI’s Swing em Java.

Tenho uma aplicação cujo frame principal é um JInternalFrame que possui um JMenuBar com diversas opções.
Obviamente, uma vez acionados qualquer uma destas opções um evento é gerado. Estes eventos são tratados no método actionPerformed(ActionEvent e). Até aí tudo bem. O problema é que o meu JInternalFrame deve ter como atributos TODOS os seus components, para que eu possa reconhecer a fonte do evento através de e.getSource().

Sendo assim, se o meu JInternalFrame tem, por exemplo, 25 JMenu’s cada um com 37 opções temos uma classe com 25x37 atributos, no mínimo ? Isso não me parece Java bem escrito !

Alguém tem uma alternativa inteligente para contornar este problema ?
[]'s,
Rafael March. [/quote]

:arrow: Vc gerencia todos os seus componentes por JInternalFrame essa gerencia outras interfaces do JMenus ? , me parace um mix com um pensamento de polimorfismo com programação estruturada.

:idea: Existe o reuso desses componentes, para cada ação do JMenus ?

Desculpa Marcio,

mas pode ser mais claro ? Qual seria a melhor maneira de fazer algo deste tipo ? Como eu poderia fazer a reutilização de simples JMenus ?

Minha situação é exatamente como foi descrita: um JInternalFrame com diversos JMenus, que por sua vez possuem diversos JMenuItems. Para cada um destes itens eu quero abrir um frame que conterá informações diferentes. Para isso, trato os eventos através do método actionPerformed(ActionEvent e). O problema é que tenho que ter todos estes itens (ou existe alguma outra forma ?) como atributos do meu JInternalFrame para que possa fazer um milhão de if’s (if(e.getSource.equals(JMenuItemn)), por exemplo) para fazer o tratamento diferente para cada um. Simples assim. O problema é que isso implicaria em muitos atributos e muitos if’s. Há de existir alguma forma mais orientada a objeto de fazer isso !

[]'s,
Rafael March.

Bom, vamos lá:

1º - Você não deve ter preguiça de fazer os passos 2-4
2º - Seus menus devem ser dinâmicos (faça uma tabela dinamica no banco para isso, com: id, idpai, descricao, codename) e monte o menu de forma recursiva
3º - codename será o identificador que chamará seus forms de uma fábrica de forms (PADRÃO FACTORY - PESQUISAR!), na hora da geração do menu dinamico, adicionaria uma action nele executando algo como (por ex): factory.getForm(codename).setVisible(true);
4º - É melhor que seu form principal seja um JFrame que CONTENHA um JInternalFrame

[quote=rafaelmarch]Desculpa Marcio,

mas pode ser mais claro ? Qual seria a melhor maneira de fazer algo deste tipo ? Como eu poderia fazer a reutilização de simples JMenus ?

Minha situação é exatamente como foi descrita: um JInternalFrame com diversos JMenus, que por sua vez possuem diversos JMenuItems. Para cada um destes itens eu quero abrir um frame que conterá informações diferentes. Para isso, trato os eventos através do método actionPerformed(ActionEvent e). O problema é que tenho que ter todos estes itens (ou existe alguma outra forma ?) como atributos do meu JInternalFrame para que possa fazer um milhão de if’s (if(e.getSource.equals(JMenuItemn)), por exemplo) para fazer o tratamento diferente para cada um. Simples assim. O problema é que isso implicaria em muitos atributos e muitos if’s. Há de existir alguma forma mais orientada a objeto de fazer isso !

[]'s,
Rafael March.[/quote]

:arrow: Forma certa orientada a objeto eu diria forma de usar patterns que entendam as suas responsabilidades e objetos que saibam que vão fazer. Um exemplo para dar outra semantica a sua ideia.

/*
 * FileTableDemo.java
 */
package demo; 
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.logging.*;
import javax.swing.*;
import javax.swing.table.*;
 
public final class FileTableDemo {
 
    private Model model;
    private View view;
    private Controller controller;
 
    public FileTableDemo() {
        super();
        model = new Model();
        view = new View();
        controller = new Controller();
 
    }
 
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
 
            public void run() {
                new FileTableDemo().view.createAndShowGUI();
            }
        });
    }
 
    private final class Model {
 
        private DefaultTableModel tableModel = new DefaultTableModel(new String[]{"File Data"}, 0) {
 
            public Class getColumnClass(final int columnIndex) {
                return String.class;
            }
        };
    }
 
    private final class View {
 
        private JFrame frame;
        private JTable table;
 
        private void createAndShowGUI() {
 
            frame = new JFrame("FileTableDemo");
            table = new JTable(model.tableModel);
            table.setFont(new Font("Monospaced", Font.PLAIN, 12));
            JMenuBar bar = new JMenuBar();
            JMenu fileMenu = new JMenu("File");
            JMenuItem openFileItem = new JMenuItem(controller.openFile);
            fileMenu.add(openFileItem);
            bar.add(fileMenu);
 
            Container container = frame.getContentPane();
            container.add(new JScrollPane(table), BorderLayout.CENTER);
            frame.setJMenuBar(bar);
 
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }
 
    public final class Controller {
 
        private Action openFile = new Transaction("openFile", "Open...", null, this);
 
        public void openFile(ActionEvent e) {
            JFileChooser chooser = new JFileChooser();
            chooser.showOpenDialog(null);
            File file = chooser.getSelectedFile();
            if (file == null) {
                return;
            }
            BufferedReader reader = null;
            model.tableModel.setRowCount(0);
            try {
                reader = new BufferedReader(new FileReader(file));
                String str = reader.readLine();
                while (str != null) {
                    model.tableModel.addRow(new Object[]{str});
                    str = reader.readLine();
                }
            } catch (final IOException ex) {
                Logger.getLogger(FileTableDemo.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    reader.close();
                } catch (IOException ex) {
                    Logger.getLogger(FileTableDemo.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
 
        class Transaction extends AbstractAction {
 
            private final Object controller;
            private transient Method method;
 
            public Transaction(final String command, final String name, final Icon icon, final Object controller) {
                super(name, icon);
                this.putValue(Action.ACTION_COMMAND_KEY, command);
                this.controller = controller;
            }
 
            public void actionPerformed(final ActionEvent e) {
                try {
                    if (method == null) {
                        method = controller.getClass().getMethod(
                                (String) getValue(Action.ACTION_COMMAND_KEY), new Class[]{ActionEvent.class});
                    }
                    method.invoke(controller, new Object[]{e});
                } catch (NoSuchMethodException ex1) {
                    throw new RuntimeException(ex1);
                } catch (InvocationTargetException ex2) {
                    throw new RuntimeException(ex2.getTargetException());
                } catch (Exception ex3) {
                    throw new RuntimeException(ex3);
                }
            }
        }
    }
}