Zamykanie aplikacji, problem z WindowListener

0

Witam,
tak jak w temacie mam problem z zamknięciem aplikacji. Próbowałem pokombinować z WindowListenerem:

/* ... */
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/* ... */

public class BeanTableGUI<T> extends JFrame implements ActionListener
{
  /* ... */

  private class MyWindowListener implements WindowListener  // W TEJ LINI WYSTĘPUJE BŁĄD
  {
    public void WindowClosing(WindowEvent e)
    {
      dispose();
    }

    public void WindowClosed(WindowEvent e){}
    public void WindowOpened(WindowEvent e){}
    public void WindowIconified(WindowEvent e){}
    public void WindowDeiconified(WindowEvent e){}
    public void WindowActivated(WindowEvent e){}
    public void WindowDeactivated(WindowEvent e){}
  }

  public BeanTableGUI(String title, final BeanDataModel<T> model)
  {
    super(title);
    this.model = model;
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    addWindowListener(new MyWindowListener());

    // menu bar
    JMenu fileMenu = new JMenu("Plik");
    JMenu pomocMenu = new JMenu("Pomoc");

    JMenuItem openItem = new JMenuItem("Otworz");
    JMenuItem saveItem = new JMenuItem("Zapisz");   
    JSeparator separator = new JSeparator();
    JMenuItem exitItem = new JMenuItem("Wyjscie");

    JMenuItem helpItem = new JMenuItem("Pomoc");
    JMenuItem aboutItem = new JMenuItem("o programie");

    menuBar.add(fileMenu);
    fileMenu.add(openItem);
    fileMenu.add(saveItem);
    fileMenu.add(separator);
    fileMenu.add(exitItem);

    fileMenu.getItem(0).setActionCommand("cmd:open");
    fileMenu.getItem(1).setActionCommand("cmd:save");
    fileMenu.getItem(3).setActionCommand("cmd:exit");

    menuBar.add(pomocMenu);
    pomocMenu.add(helpItem);
    pomocMenu.add(aboutItem);

    pomocMenu.getItem(0).setActionCommand("cmd:help");
    pomocMenu.getItem(1).setActionCommand("cmd:about");

    setJMenuBar(menuBar);
    fileMenu.addActionListener(this);
    pomocMenu.addActionListener(this);
     
    /* ... */
  }

  /* ... */

  @Override
  public void actionPerformed(ActionEvent e)
  {
    if (e.getActionCommand().equals("cmd:exit"))
      dispose();
      
    /* ... */
  }
   
  /* ... */

}

Netbeans:

Compiling 1 source file to C:\..\build\classes

C:\..\src\..\BeanTableGUI.java:50:
(..).BeanTableGUI.MyWindowListener is not abstract and does not override abstract method windowDeactivated(java.awt.event.WindowEvent) in java.awt.event.WindowListener private class MyWindowListener implements WindowListener

Note: C:\..\src\..\BeanTableGUI.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

1 error

C:\..\nbproject\build-impl.xml:363: The following error occurred while executing this line:

C:\..\nbproject\build-impl.xml:168: Compile failed; see the compiler error output for details.

BUILD FAILED (total time: 0 seconds)

Nie potrafię poradzić se z tym problemem, ogólny problem polega na tym, że menu nie działa, proszę o pomoc.

0

(..).BeanTableGUI.MyWindowListener is not abstract and does not override abstract method windowDeactivated(java.awt.event.WindowEvent) in java.awt.event.WindowListener private class MyWindowListener implements WindowListener

Google trnaslate się kłania. :/

0

Musiałbym się zastanowić od kiedy to google translate rozwiązuje problemy programistyczne :-P
Sorry zapomniałem napisać, że choć znam nieco angielski to nie mogę i tak se z tym poradzić... dla mnie forum to ostateczność, dla ciebie to wniosek, że jeśli chodzi o jave to nie jestem taki dobry z niej. Wskazówkę, radę można poprosić? Z góry dziękuje.

0

Ta klasa (MyWindowList...) nie jest abstrakcyjna i nie nadpisuje abstrakcyjnej metody windowDeac...

Musisz nadpisać tę metodę w swojej klasie. Lub zrobić swoją klasę abstrakcyjną.

0

No ok, dzięki Wam obydwóm. Problem teraz jest taki, że jak zrobiłem tą klasę jako abstrakcyjną to nie mogę już jej użyć w addWindowListener, a jak próbuje zrobić klasę potomną tej abstrakcyjnej to znowu mi wywala, że i ta musi być abstrakcyjna [???]

0

A Ty odróżniasz duże litery od małych?

    public void windowClosing(WindowEvent e)
    {
      dispose();
    }

    public void windowClosed(WindowEvent e){}
    public void windowOpened(WindowEvent e){}
    public void windowIconified(WindowEvent e){}
    public void windowDeiconified(WindowEvent e){}
    public void windowActivated(WindowEvent e){}
    public void windowDeactivated(WindowEvent e){}

Możesz zamykanie aplikacji zrobić prościej, zamiast dodawac WindowListenera umieść w konstruktorze

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
0

Ok, rozwiązało to problem z WindowListenerem. Jednak menu wciąż nie działa :-( Co zrobiłem źle, że aplikacja nie zamyka się, gdy kliknę w pozycje menu "Wyjscie"? To co zmieniłem (pozostały kodu, który podałem na początku jest taki sam):

  private abstract class MyWindowListener implements WindowListener
  {
    @Override
    public void windowClosing(WindowEvent e)
    {
      dispose();
    }

    @Override
    public void windowClosed(WindowEvent e){}
    @Override
    public void windowOpened(WindowEvent e){}
    @Override
    public void windowIconified(WindowEvent e){}
    @Override
    public void windowDeiconified(WindowEvent e){}
    @Override
    public void windowActivated(WindowEvent e){}
    @Override
    public void windowDeactivated(WindowEvent e){}
  }

  private class MyWList extends MyWindowListener {}

  public BeanTableGUI(String title, final BeanDataModel<T> model)
  {
    super(title);
    this.model = model;
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    addWindowListener(new MyWList());
0

JAk chcesz zamknąć aplikację, to użyj: System.exit(0);

0

Nie ważne czy tam będzie System.exit(0), czy dispose(), program po prostu nie reaguje na kliknięcie w menu.

0

A co ma niby WindowsLintener do jakiejś pozycji w menu?
Niby dlatego, że nazwałeś ją "Wyjście" ma uruchamiać windowClosing?

Musisz zarejestrować na pozycji menu za pomocą addActionListener obiekt ActionListener, który wykona dispose().

http://java.sun.com/javase/6/docs/api/javax/swing/JMenuItem.html

0

Po pierwsze

    setDefaultCloseOperation(EXIT_ON_CLOSE);

lub

    addWindowListener(new MyWindowListener());

Po drugie, źle jest podpięty ActionListener

    JMenuItem exitItem = new JMenuItem("Wyjście");
    exitItem.setActionCommand("cmd:open");
    exitItem.addActionListener(this);

Po trzecie (jak już pisał @losowa nazwa)

  public void actionPerformed(ActionEvent e)
  {
    if (e.getActionCommand().equals("cmd:exit"))
      System.exit(0);
     
    /* ... */
  }
0

Miało być

   exitItem.setActionCommand("cmd:exit");

może ktos skleić te dwa posty?

1 użytkowników online, w tym zalogowanych: 0, gości: 1