Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    88

    comunicazione tra classi

    Salve a tutti,
    sto implementando un'interfaccia con le swing e avrei bisogno di aiuto.
    Ho realizzato un JFrame al cui interno setto una classe Menu che estende JMenuBar.
    Questo menù ha due voci e vorrei che a seconda di quella che clicco mi aprisse il giusto pannello nel frame.

    Come faccio a far catturare l'evento della classe menu al frame?


    codice:
    public class MenuBar extends JMenuBar implements IMenuBar,ActionListener { 
    private JMenuItem exitItem; 
    private JMenuItem generaTracciato; 
    public JComponent getComponent() { 
    JMenuBar menuBar = new JMenuBar(); 
    JMenu m = new JMenu("File"); 
    generaTracciato = new JMenuItem("Genera Tracciato"); generaTracciato.addActionListener(this); 
    m.add(generaTracciato); exitItem = new JMenuItem("Exit"); exitItem.addActionListener(this); 
    m.add(exitItem); menuBar.add(m); 
    return menuBar; } 
    
    @Override public void actionPerformed(ActionEvent evt) { 
    Object source = evt.getSource();
     if (source == exitItem){ 
    System.exit(0); 
    } else if (source == generaTracciato) { 
    System.out.println("ciao"); }
     }
     }

    codice:
    public class FactoryUI extends JFrame implements IFactoryUI{ /** * */ 
    private static final long serialVersionUID = 1L; 
    public static Console console; 
    final static int widthPercent = 53; 
    final static int heightPercent = 65; 
    public FactoryUI() { 
    } 
    
    public static JFrame create(JFrame frame){ 
    frame.setName("framePrincipale"); 
    frame.setTitle("pdp reader"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    impostaDimensioni(frame); 
    JMenuBar menu = (JMenuBar) buildMenuBar().getComponent(); 
    frame.setJMenuBar(menu); 
    frame.setResizable(false); 
    frame.getContentPane().setLayout(new BorderLayout()); // frame.getContentPane().add(buildFileChooserPanel().getComponent(), BorderLayout.CENTER); // frame.getContentPane().add(buildConsole().getComponent(), BorderLayout.SOUTH); 
    try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); frame.setIconImage(new ImageIcon(frame.getClass() .getResource("/logo_android.png")).getImage()); } catch (ClassNotFoundException e) { JOptionPane.showMessageDialog(null, e.getMessage() , "", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } catch (InstantiationException e) { JOptionPane.showMessageDialog(null, e.getMessage() , "", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } catch (IllegalAccessException e) { JOptionPane.showMessageDialog(null, e.getMessage() , "", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { JOptionPane.showMessageDialog(null, e.getMessage() , "", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } frame.setVisible(true); 
    return frame; }

  2. #2
    implementando l'ActionListener nel JFrame invece che nella MenuBar

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    88
    e come aggancio i listener sui singoli ItemMenu?

  4. #4
    Non che siano fatti miei, ma perché non crei un JDesktopPane per poi attaccarci il JMenuBar?

    poi puoi provare con il comando setActionCommand
    codice:
      JMenuItem menuItemQT = new JMenuItem("Quit");
            menuItemQT.setActionCommand("Q");
            menuQ.add(menuItemQT);
    codice:
    if (e.getActionCommand().EqualIgnoreCase("Q")) { //new
            dosomething();
    }
    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    Potresti ritornare i menu con un metodo come fai con il MenuBar.

    Ma secondo me il problema sta a monte nell'utilizzo dell'ereditarieta'. Erediti da una classe se vuoi estenderne le funzionalita';

    Mentre i listener si usano da "fuori" la classe, ovvero nelle classi client (come in questo caso potrebbe essere JFrame) per "iniettare" codice della classe client nel Component senza corromperne interfaccia.

    Come puoi notare i metodi che utilizzi sono tutti pubblici e non protected, ovvero sono pensati per essere utilizzati da classi esterne che hanno un riferimento a (e non ereditano da) MenuBar e JMenuItem.

    Quindi io ti consiglio di evitare di creare una sottoclasse di JMenuBar e di gestire tutto dal JFrame o eventualmente da una terza classe (che nel paradigma MVC e' il controller) che tiene un riferimento al jFrame per la gestione dell'evento.

    Se usi la classe Action non devi nemmeno perdere tempo a settare le etichette, le keyStroke etc.
    Nel metodo ActionPerformed puoi gestire l'evento direttamente (se lo implementi in JFrame) o tramite un riferimento a JFrame (che devi passare, magari nel costruttore) se lo implementi all'interno di una classe controller

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.