Listener registrieren

programmierer123

Aktives Mitglied
Hallo,
warum kann ich all meine Listener nicht registrieren? Überall bekomme ich Compilefehler (<identifier> expected und illegal start of type)

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;


public class TrayIconFeature {

    private TerminSoftware terminsoftware;
    private PopupMenu popup;
    private TrayIcon trayIcon = null;
    private MenuItem anzeigen;
    private MenuItem ausblenden;
    private MenuItem beenden;

    public TrayIconFeature(TerminSoftware terminSoftware) {
        this.terminsoftware = terminSoftware;
        {
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "Programm wird beendet, da das Betriebssystem kein TrayIcon unterstützt!", "Warnung", JOptionPane.WARNING_MESSAGE);
                System.exit(-1);
            }

            Image imageIcon = Toolkit.getDefaultToolkit().getImage("res/appdefault.png");
            SystemTray tray = SystemTray.getSystemTray();
            popup = new PopupMenu();

            anzeigen = new MenuItem(Konstanten.PROGRAMMNAME + " anzeigen");
            ausblenden = new MenuItem(Konstanten.PROGRAMMNAME + " ausblenden");
            beenden = new MenuItem(Konstanten.PROGRAMMNAME + " beenden");

            popup.add(anzeigen);
            popup.add(ausblenden);
            popup.addSeparator();
            popup.add(beenden);

            trayIcon = new TrayIcon(imageIcon, "TerminSoftware", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
    }

    private static void editPopupMenu(PopupMenu popup) {

    }

    class MyWindowListener extends WindowAdapter {

        @Override
        public void windowClosing(WindowEvent e) {
            popup.remove(ausblenden);
            popup.insert(anzeigen, 0);

        }

        @Override
        public void windowOpened(WindowEvent e) {
            popup.remove(anzeigen);
            popup.insert(ausblenden, 0);
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
            popup.remove(anzeigen);
            popup.insert(ausblenden, 0);
        }

        @Override
        public void windowIconified(WindowEvent e) {
            popup.remove(ausblenden);
            popup.insert(anzeigen, 0);
        }

    }
    terminsoftware.addActionListener(new MyWindowListener());



    class LeftMouseListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e) && terminsoftware.isVisible()) {
                terminsoftware.setExtendedState(Frame.ICONIFIED);
            }
            else if (SwingUtilities.isLeftMouseButton(e) && !terminsoftware.isVisible()) {
                terminsoftware.setExtendedState(Frame.NORMAL);
            }
            else if (SwingUtilities.isRightMouseButton(e) && terminsoftware.isVisible()) {
                popup.remove(anzeigen);
                popup.insert(ausblenden, 0);
            }
            else if (SwingUtilities.isRightMouseButton(e) && !terminsoftware.isVisible()) {
                popup.remove(ausblenden);
                popup.insert(anzeigen, 0);
            }

        }
    }
    trayIcon.addMouseListener(new LeftMouseListener());


    class IconListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (terminsoftware.isVisible()) {
                terminsoftware.setVisible(false);
            } else {
                terminsoftware.setVisible(true);
            }
        }
    }
    trayIcon.addActionListener(new IconListener());


    class anzeigenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            terminsoftware.setVisible(true);
        }
    }
    anzeigen.addActionListener(new anzeigenListener());


    class ausblendenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            terminsoftware.setVisible(false);
        }
    }
    ausblenden.addActionListener(new ausblendenListener());


    class closeProgram implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    }
    beenden.addActionListener(new closeProgram());
}
 
Hallo.

öhm, weil sowas
Java:
terminsoftware.addActionListener(new MyWindowListener());
in einen Methode-Rumpf gehört oder im Konstruktor. Pack das alles mal in dein Konstruktor.

Grüße
 
Wisst ihr auch warum beim minimieren des Programms folgende Dinge nicht funktionieren?

* Beim Klick auf das Icon, wird das Fenster nicht ein/ausgeblendet.
* Wenn man davor minimiert hat und auf Fenster ein/ausblenden klickt, dann funktioniert das auch nicht
* Warum funktioniert es nicht mit setVisible(true) bzw. setVisible(false)?

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;


public class TrayIconFeature {

    private TerminSoftware terminsoftware;
    private PopupMenu popup;
    private TrayIcon trayIcon = null;
    private MenuItem anzeigen;
    private MenuItem ausblenden;
    private MenuItem beenden;

    public TrayIconFeature(TerminSoftware terminsoftware) {
        this.terminsoftware = terminsoftware;
        {
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "Programm wird beendet, da das Betriebssystem kein TrayIcon unterstützt!", "Warnung", JOptionPane.WARNING_MESSAGE);
                System.exit(-1);
            }

            Image imageIcon = Toolkit.getDefaultToolkit().getImage("res/appdefault.png");
            SystemTray tray = SystemTray.getSystemTray();
            popup = new PopupMenu();

            anzeigen = new MenuItem(Konstanten.PROGRAMMNAME + " anzeigen");
            ausblenden = new MenuItem(Konstanten.PROGRAMMNAME + " ausblenden");
            beenden = new MenuItem(Konstanten.PROGRAMMNAME + " beenden");

            popup.add(anzeigen);
            popup.add(ausblenden);
            popup.addSeparator();
            popup.add(beenden);

            trayIcon = new TrayIcon(imageIcon, "TerminSoftware", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
        setupInteractions();
    }

    private void setupInteractions(){
        terminsoftware.addWindowListener(new MyWindowListener());
        trayIcon.addMouseListener(new LeftMouseListener());
        trayIcon.addActionListener(new IconListener());
        anzeigen.addActionListener(new anzeigenListener());
        ausblenden.addActionListener(new ausblendenListener());
        beenden.addActionListener(new closeProgram());
    }

    private void editPopupMenu(PopupMenu popup, MenuItem insert, int index, MenuItem remove) {
        popup.insert(insert, index);
        popup.remove(remove);
    }

    private class MyWindowListener extends WindowAdapter {

        @Override
        public void windowClosing(WindowEvent e) {
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }

        @Override
        public void windowOpened(WindowEvent e) {
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }

        @Override
        public void windowIconified(WindowEvent e) {
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }
    }


    private class LeftMouseListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e) && terminsoftware.isVisible()) {
                terminsoftware.setExtendedState(Frame.ICONIFIED);
            }
            else if (SwingUtilities.isLeftMouseButton(e) && !terminsoftware.isVisible()) {
                terminsoftware.setExtendedState(Frame.NORMAL);
            }
            else if (SwingUtilities.isRightMouseButton(e) && terminsoftware.isVisible()) {
                editPopupMenu(popup, ausblenden,0,anzeigen);
            }
            else if (SwingUtilities.isRightMouseButton(e) && !terminsoftware.isVisible()) {
                editPopupMenu(popup, anzeigen,0,ausblenden);
            }

        }
    }


    private class IconListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (terminsoftware.isVisible()) {
                terminsoftware.setVisible(false);
            } else {
                terminsoftware.setVisible(true);
            }
        }
    }


    private class anzeigenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            terminsoftware.setVisible(true);
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }
    }


    private class ausblendenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            terminsoftware.setVisible(false);
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }
    }


    private class closeProgram implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    }

}
 
Zuletzt bearbeitet:
Findet niemand den Fehler?
Das wurde doch in diesem Thread längst geklärt. Du mußt dir eben überlegen, welches Ergebnis du beim Minimieren bzw. Schliessen haben möchtest und dann dafür sorgen, dass es auch so geschieht.
Beim "sichtbar" machen, musst du es auf die jeweils passende Weise handhaben. Wenn du das Fenster unsichtbar gemacht hast, musst du es wieder sichtbar machen. Wenn du es minimiert hast, musst du es wieder auf die vorherige Grösse bringen. Ausserdem solltest du dir bewusst machen, dass ein minimiertes Fenster nicht unbedingt unsichtbar ist und deine Bedingungen entsprechend formulieren. Im Moment ist das alles noch nicht konsistent.
 
Ich brauche mehr Tipps. Mir ist nicht klar, wozu ich dieses setExtendedState()/getExtendedState() brauche?
Den Code hab ich so umgeändert, dass wenn man das Fenster minimiert, der Frame auf setVisible(false) wird.
Und beim maximieren wird der Frame auf setVisible(true) gesetzt.
Trotzdem hab ich das gleiche Problem.

@truesoul
An welche Java Code Konventionen halte ich mich nicht?

Java:
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;

public class TerminSoftware extends JFrame {

    private static final long serialVersionUID = 1L;

    public TerminSoftware() {

       
        new TrayIconFeature(this);
        pack();
    }

   
}

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;


public class TrayIconFeature {

    private TerminSoftware terminsoftware;
    private PopupMenu popup;
    private TrayIcon trayIcon = null;
    private MenuItem anzeigen;
    private MenuItem ausblenden;
    private MenuItem beenden;

    public TrayIconFeature(TerminSoftware terminsoftware) {
        this.terminsoftware = terminsoftware;
        {
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "Programm wird beendet, da das Betriebssystem kein TrayIcon unterstützt!", "Warnung", JOptionPane.WARNING_MESSAGE);
                System.exit(-1);
            }

            Image imageIcon = Toolkit.getDefaultToolkit().getImage("res/appdefault.png");
            SystemTray tray = SystemTray.getSystemTray();
            popup = new PopupMenu();

            anzeigen = new MenuItem(Konstanten.PROGRAMMNAME + " anzeigen");
            ausblenden = new MenuItem(Konstanten.PROGRAMMNAME + " ausblenden");
            beenden = new MenuItem(Konstanten.PROGRAMMNAME + " beenden");

            popup.add(anzeigen);
            popup.add(ausblenden);
            popup.addSeparator();
            popup.add(beenden);

            trayIcon = new TrayIcon(imageIcon, "TerminSoftware", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
        setupInteractions();
    }

    private void setupInteractions(){
        terminsoftware.addWindowListener(new MyWindowListener());
        trayIcon.addMouseListener(new LeftMouseListener());
        trayIcon.addActionListener(new IconListener());
        anzeigen.addActionListener(new anzeigenListener());
        ausblenden.addActionListener(new ausblendenListener());
        beenden.addActionListener(new closeProgram());
    }

    private void editPopupMenu(PopupMenu popup, MenuItem insert, int index, MenuItem remove) {
        popup.insert(insert, index);
        popup.remove(remove);
    }

    private class MyWindowListener extends WindowAdapter {

        @Override
        public void windowClosing(WindowEvent e) {
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }

        @Override
        public void windowOpened(WindowEvent e) {
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
            editPopupMenu(popup, ausblenden,0,anzeigen);
            terminsoftware.setVisible(true);
        }

        @Override
        public void windowIconified(WindowEvent e) {
            editPopupMenu(popup, anzeigen,0,ausblenden);
            terminsoftware.setVisible(false);
        }
    }


    private class LeftMouseListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e) && terminsoftware.isVisible()) {
                terminsoftware.setVisible(false);
            }
            else if (SwingUtilities.isLeftMouseButton(e) && !terminsoftware.isVisible()) {
                terminsoftware.setVisible(true);
            }
        }
    }


    private class IconListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (terminsoftware.isVisible()) {
                terminsoftware.setVisible(false);
            } else {
                terminsoftware.setVisible(true);
            }
        }
    }


    private class anzeigenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            terminsoftware.setVisible(true);
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }
    }


    private class ausblendenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            terminsoftware.setVisible(false);
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }
    }


    private class closeProgram implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    }

}
 
An welche Java Code Konventionen halte ich mich nicht?

anzeigeListener, closeProgram und ausblendenListener zum Beispiel.

Ein Beispiel:

Java:
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class TrayIconDemo {
    private static JFrame frame;

    public static void main(String[] args) {
        /* Use an appropriate Look and Feel */
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {

        frame = new JFrame("FrameDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new JButton("EXAMPLE"), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);

        // Check the SystemTray support
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }
        final PopupMenu popup = new PopupMenu();
        final TrayIcon trayIcon = new TrayIcon(createImage("plus_orange.png", "tray icon"));
        final SystemTray tray = SystemTray.getSystemTray();

        Menu displayMenu = new Menu("Display");
        MenuItem visibleItem = new MenuItem("Sichtbar");
        MenuItem invisibleItem = new MenuItem("Unsichtbar");

        popup.add(displayMenu);
        displayMenu.add(visibleItem);
        displayMenu.add(invisibleItem);

        trayIcon.setPopupMenu(popup);

        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.out.println("TrayIcon could not be added.");
            return;
        }

        trayIcon.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "This dialog box is run from System Tray");
            }
        });

        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                MenuItem item = (MenuItem) e.getSource();
                if ("Sichtbar".equals(item.getLabel())) {
                    frame.setVisible(true);

                } else if ("Unsichtbar".equals(item.getLabel())) {
                    frame.setVisible(false);
                }
            }
        };

        visibleItem.addActionListener(listener);
        invisibleItem.addActionListener(listener);
    }

    protected static Image createImage(String path, String description) {
        URL imageURL = TrayIconDemo.class.getResource(path);

        if (imageURL == null) {
            System.err.println("Resource not found: " + path);
            return null;
        } else {
            return (new ImageIcon(imageURL, description)).getImage();
        }
    }
}

Es funktioniert wunderbar. Baue doch ein paar Konsolenausgaben ein oder noch besser benutze den Debugger.
 
Mir ist nicht klar, wozu ich dieses setExtendedState()/getExtendedState() brauche?
Mit setExtendedState() kannst du den Status des Fensters setzen und mit getExtendedState() kannst du ihn abfragen. Z.B. kannst du ein JFrame mit setExtendedState(JFrame.NORMAL) auf normale Größe bringen, was ganz praktisch sein kann, wenn man ein minimiertes Fenster auf Normalgröße bringen will.
 
Es fehlt jetzt nur noch eine Sache. beim Klick auf das Icon wird das Fenster nicht minimiert/maximiert.
Und ich weiß nicht, wo der Fehler ist. Mit setExtendedState(JFrame.NORMAL) etc. hab ich es schon versucht.
Funktioniert trotzdem nicht.

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;


public class TrayIconFeature {

    private TerminSoftware terminsoftware;
    private PopupMenu popup;
    private TrayIcon trayIcon = null;
    private MenuItem anzeigen;
    private MenuItem ausblenden;
    private MenuItem beenden;

    public TrayIconFeature(TerminSoftware terminsoftware) {
        this.terminsoftware = terminsoftware;
        {
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "Programm wird beendet, da das Betriebssystem kein TrayIcon unterstützt!", "Warnung", JOptionPane.WARNING_MESSAGE);
                System.exit(-1);
            }

            Image imageIcon = Toolkit.getDefaultToolkit().getImage("res/appdefault.png");
            SystemTray tray = SystemTray.getSystemTray();
            popup = new PopupMenu();

            anzeigen = new MenuItem(Konstanten.PROGRAMMNAME + " anzeigen");
            ausblenden = new MenuItem(Konstanten.PROGRAMMNAME + " ausblenden");
            beenden = new MenuItem(Konstanten.PROGRAMMNAME + " beenden");

            popup.add(anzeigen);
            popup.add(ausblenden);
            popup.addSeparator();
            popup.add(beenden);

            trayIcon = new TrayIcon(imageIcon, "TerminSoftware", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
        setupInteractions();
    }

    private void setupInteractions(){
        terminsoftware.addWindowListener(new MyWindowListener());
        trayIcon.addMouseListener(new LeftMouseListener());
        trayIcon.addActionListener(new IconListener());
        anzeigen.addActionListener(new anzeigenListener());
        ausblenden.addActionListener(new ausblendenListener());
        beenden.addActionListener(new closeProgram());
    }

    private void editPopupMenu(PopupMenu popup, MenuItem insert, int index, MenuItem remove) {
        popup.insert(insert, index);
        popup.remove(remove);
    }

    private class MyWindowListener extends WindowAdapter {

        @Override
        public void windowClosing(WindowEvent e) {
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }

        @Override
        public void windowOpened(WindowEvent e) {
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
            editPopupMenu(popup, ausblenden,0,anzeigen);
            terminsoftware.setVisible(true);
        }

        @Override
        public void windowIconified(WindowEvent e) {
            editPopupMenu(popup, anzeigen,0,ausblenden);
            terminsoftware.setVisible(false);
        }
    }


    private class LeftMouseListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e) && terminsoftware.isVisible()) {
                terminsoftware.setVisible(false);
            }
            else if (SwingUtilities.isLeftMouseButton(e) && !terminsoftware.isVisible()) {
                terminsoftware.setVisible(true);
            }
        }
    }


    private class IconListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (terminsoftware.isVisible()) {
                terminsoftware.setVisible(false);
            } else {
                terminsoftware.setVisible(true);
            }
        }
    }


    private class anzeigenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            terminsoftware.setExtendedState(JFrame.NORMAL);
            terminsoftware.setVisible(true);
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }
    }


    private class ausblendenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            terminsoftware.setExtendedState(JFrame.ICONIFIED);
            terminsoftware.setVisible(false);
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }
    }


    private class closeProgram implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    }

}
 
Habe jetzt Ausgaben eingefügt und mir ist aufgefallen, dass die LeftMouseListener Klasse reagiert.
Warum wird nicht der Code für die Klasse IconListener ausgeführt? Immerhin sage ich doch, dass beim Klick auf das Icon bestimmter Code ausgeführt werden soll.

Java:
private class LeftMouseListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e) && terminsoftware.isVisible()) {
                System.out.println("mouseClicked Left && Visible");
                terminsoftware.setVisible(false);
            }
            else if (SwingUtilities.isLeftMouseButton(e) && !terminsoftware.isVisible()) {
                System.out.println("mouseClicked Left && Invisible");
                terminsoftware.setVisible(true);
            }
        }
    }


    private class IconListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (terminsoftware.isVisible()) {
                System.out.println("IconListener Visible");
                terminsoftware.setVisible(false);
            } else {
                System.out.println("IconListener Invisible");
                terminsoftware.setVisible(true);
            }
        }
    }
 
Folgende Änderungen habe ich gemacht.

- Den IconListener verwende ich nicht mehr
- LeftMouseListener habe ich bearbeitet.

Jetzt funktioniert das Programm fast richtig. Eine Sache fehlt noch. Wenn man auf Minimieren klickt, dann zweimal auf das Icon, dannach Rechtsklick auf das Icon, wird das Popupmenü "ausblenden" angezeigt.
Ich denke, dass liegt an meiner if-Abfrage im LeftMouseListener.

Wie kann ich dieses Problem lösen?

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;


public class TrayIconFeature {

    private TerminSoftware terminsoftware;
    private PopupMenu popup;
    private TrayIcon trayIcon = null;
    private MenuItem anzeigen;
    private MenuItem ausblenden;
    private MenuItem beenden;

    public TrayIconFeature(TerminSoftware terminsoftware) {
        this.terminsoftware = terminsoftware;
        {
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "Programm wird beendet, da das Betriebssystem kein TrayIcon unterstützt!", "Warnung", JOptionPane.WARNING_MESSAGE);
                System.exit(-1);
            }

            Image imageIcon = Toolkit.getDefaultToolkit().getImage("res/appdefault.png");
            SystemTray tray = SystemTray.getSystemTray();
            popup = new PopupMenu();

            anzeigen = new MenuItem(Konstanten.PROGRAMMNAME + " anzeigen");
            ausblenden = new MenuItem(Konstanten.PROGRAMMNAME + " ausblenden");
            beenden = new MenuItem(Konstanten.PROGRAMMNAME + " beenden");

            popup.add(anzeigen);
            popup.add(ausblenden);
            popup.addSeparator();
            popup.add(beenden);

            trayIcon = new TrayIcon(imageIcon, "TerminSoftware", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
        setupInteractions();
    }

    private void setupInteractions(){
        terminsoftware.addWindowListener(new MyWindowListener());
        trayIcon.addMouseListener(new LeftMouseListener());
        //trayIcon.addActionListener(new IconListener());
        anzeigen.addActionListener(new AnzeigenListener());
        ausblenden.addActionListener(new AusblendenListener());
        beenden.addActionListener(new CloseProgram());
    }

    private void editPopupMenu(PopupMenu popup, MenuItem insert, int index, MenuItem remove) {
        popup.insert(insert, index);
        popup.remove(remove);
    }

    private class MyWindowListener extends WindowAdapter {

        @Override
        public void windowClosing(WindowEvent e) {
            System.out.println("windowClosing");
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }

        @Override
        public void windowOpened(WindowEvent e) {
            System.out.println("windowOpened");
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
            System.out.println("windowDeiconified");
            editPopupMenu(popup, ausblenden,0,anzeigen);
            terminsoftware.setVisible(true);
        }

        @Override
        public void windowIconified(WindowEvent e) {
            System.out.println("windowIconified");
            editPopupMenu(popup, anzeigen,0,ausblenden);
            terminsoftware.setVisible(false);
        }
    }


    private class LeftMouseListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e)  &&   terminsoftware.isVisible()) {
                System.out.println("mouseClicked Left && Visible");
                terminsoftware.setVisible(false);
                terminsoftware.setExtendedState(JFrame.ICONIFIED);
                editPopupMenu(popup, ausblenden,0,anzeigen);
            }
            else if (SwingUtilities.isLeftMouseButton(e) && !terminsoftware.isVisible()) {
                System.out.println("mouseClicked Left && Invisible");
                terminsoftware.setVisible(true);
                terminsoftware.setExtendedState(JFrame.NORMAL);
                editPopupMenu(popup, anzeigen,0,ausblenden);
            }
        }
    }


    private class IconListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (terminsoftware.isVisible()) {
                System.out.println("IconListener Visible");
                terminsoftware.setVisible(false);
            } else {
                System.out.println("IconListener Invisible");
                terminsoftware.setVisible(true);
            }
        }
    }


    private class AnzeigenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("AnzeigenListener");
            terminsoftware.setExtendedState(JFrame.NORMAL);
            terminsoftware.setVisible(true);
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }
    }


    private class AusblendenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("AusblendenListener");
            terminsoftware.setExtendedState(JFrame.ICONIFIED);
            terminsoftware.setVisible(false);
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }
    }


    private class CloseProgram implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("CloseProgram");
            System.exit(0);
        }
    }

}
 
Zuletzt bearbeitet:
Jetzt funktioniert gar nichts mehr. Könnt ihr mir bitte helfen. Sitze schon die ganze Nacht daran. Bin am probieren aber es will nicht klappen.

Mir ist außerdem noch nicht der Unterschied zwischen JFrame.NORMAL und setVisible(true) bekannt?

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;


public class TrayIconFeature {

    private Remember remember;
    private PopupMenu popup;
    private TrayIcon trayIcon = null;
    private MenuItem anzeigen;
    private MenuItem ausblenden;
    private MenuItem beenden;

    public TrayIconFeature(Remember remember) {
        this.remember = remember;
        {
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "Programm wird beendet, da das Betriebssystem kein TrayIcon unterstützt!", "Warnung", JOptionPane.WARNING_MESSAGE);
                System.exit(-1);
            }

            Image imageIcon = Toolkit.getDefaultToolkit().getImage("img/appdefault.png");
            SystemTray tray = SystemTray.getSystemTray();
            popup = new PopupMenu();

            anzeigen = new MenuItem(Constants.PROGRAM_NAME + " anzeigen");
            ausblenden = new MenuItem(Constants.PROGRAM_NAME + " ausblenden");
            beenden = new MenuItem(Constants.PROGRAM_NAME + " beenden");

            popup.add(anzeigen);
            popup.add(ausblenden);
            popup.addSeparator();
            popup.add(beenden);

            trayIcon = new TrayIcon(imageIcon, "Remember", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
        setupInteractions();
    }

    private void setupInteractions(){
        remember.addWindowListener(new MyWindowListener());
        trayIcon.addMouseListener(new LeftMouseListener());
        anzeigen.addActionListener(new AnzeigenListener());
        ausblenden.addActionListener(new AusblendenListener());
        beenden.addActionListener(new CloseProgram());
    }

    private void editPopupMenu(PopupMenu popup, MenuItem insert, int index, MenuItem remove) {
        popup.insert(insert, index);
        popup.remove(remove);
    }

    private class MyWindowListener extends WindowAdapter {

        @Override
        public void windowClosing(WindowEvent e) {
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }

        @Override
        public void windowOpened(WindowEvent e) {
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
            editPopupMenu(popup, ausblenden,0,anzeigen);
            //remember.setVisible(true);
        }

        @Override
        public void windowIconified(WindowEvent e) {
            editPopupMenu(popup, anzeigen,0,ausblenden);
            remember.setVisible(false);
        }
    }


    private class LeftMouseListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e)  &&   remember.getExtendedState()==JFrame.NORMAL) {
                System.out.println("isLeftMouseButton + NORMAL");
                //remember.setVisible(false);
                remember.setExtendedState(JFrame.ICONIFIED);
                editPopupMenu(popup, anzeigen,0,ausblenden);
            }
            else if (SwingUtilities.isLeftMouseButton(e) && remember.getExtendedState()==JFrame.ICONIFIED) {
                //remember.setVisible(true);
                remember.setExtendedState(JFrame.NORMAL);
                editPopupMenu(popup, ausblenden,0,anzeigen);
            }
        }
    }


    /*private class IconListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (remember.isVisible()) {
                remember.setVisible(false);
            } else {
                remember.setVisible(true);
            }
        }
    }*/


    private class AnzeigenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            remember.setExtendedState(JFrame.NORMAL);
            //remember.setVisible(true);
            editPopupMenu(popup, ausblenden,0,anzeigen);
        }
    }


    private class AusblendenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            remember.setExtendedState(JFrame.ICONIFIED);
            //remember.setVisible(false);
            editPopupMenu(popup, anzeigen,0,ausblenden);
        }
    }


    private class CloseProgram implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    }

}
 
Jetzt funktioniert gar nichts mehr. Könnt ihr mir bitte helfen. Sitze schon die ganze Nacht daran. Bin am probieren aber es will nicht klappen.
Eigentlich müsstest du längst alle nötigen Informationen haben und nur dein Programm vernünftig strukturieren. Das ist im Moment noch ziemlich durcheinander.

Du könntest je eine Methode zum Ein- und Ausblenden programmieren, die alles tut, was jeweils dazu gehört (unsichtbar/sichtbar machen, Menü anpassen, ggf. Status setzen). Dann kannst du eine dritte Methode zum hin und her schalten programmieren, die die beiden anderen Methoden entsprechend benutzt. Danach gehst du die Ereignisse durch, bei denen du einblenden, ausblenden oder umschalten willst und rufst dort die jeweils passende der drei Methode auf.

Zur Unterstützung kann noch ein WindowStateListener nützlich sein, um den Fensterstatus zwischen zu speichern, damit du beim Einblenden wieder auf die vorherige Größe schalten kannst (wenn man z.B. ein maximiertes Fenster aus- und einblendet, soll es danach ja nicht Normalgröße haben). Die Menüpunkte würde ich übrigens nicht entfernen und einfügen, sondern deaktivieren und aktivieren.
 
Mein Code ist nun übersichtlicher. Habe aber immer noch das gleiche Problem. Nachdem auf das Icon klickt, soll das Fenster ein/ausgeblendet werden.
Ein/Ausblenden mache ich doch mit setVisible? Warum funktioniert das also nicht mit setVisible und warum brauche ich dafür setExtendedState?
Das ist mein jetziger Code.

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;


public class TrayIconFeature {

    private Remember remember;
    private PopupMenu popup;
    private TrayIcon trayIcon = null;
    private MenuItem anzeigen;
    private MenuItem ausblenden;
    private MenuItem beenden;

    public TrayIconFeature(Remember remember) {
        this.remember = remember;
        {
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "Programm wird beendet, da das Betriebssystem kein TrayIcon unterstützt!", "Warnung", JOptionPane.WARNING_MESSAGE);
                System.exit(-1);
            }

            Image imageIcon = Toolkit.getDefaultToolkit().getImage("img/appdefault.png");
            SystemTray tray = SystemTray.getSystemTray();
            popup = new PopupMenu();

            anzeigen = new MenuItem(Constants.PROGRAM_NAME + " anzeigen");
            ausblenden = new MenuItem(Constants.PROGRAM_NAME + " ausblenden");
            beenden = new MenuItem(Constants.PROGRAM_NAME + " beenden");

            popup.add(anzeigen);
            popup.add(ausblenden);
            popup.addSeparator();
            popup.add(beenden);

            trayIcon = new TrayIcon(imageIcon, "Remember", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
        setupInteractions();
    }

    private void setupInteractions(){
        remember.addWindowListener(new MyWindowListener());
        trayIcon.addMouseListener(new IconClickedListener());
        anzeigen.addActionListener(new AnzeigenListener());
        ausblenden.addActionListener(new AusblendenListener());
        beenden.addActionListener(new CloseProgram());
    }

    private void editPopupMenu(MenuItem insert, int index, MenuItem remove) {
        popup.insert(insert, index);
        popup.remove(remove);
    }

    private void showWindow(){
        remember.setVisible(true);
        editPopupMenu(ausblenden, 0, anzeigen);
    }

    private void hideWindow(){
        remember.setVisible(false);
        editPopupMenu(anzeigen, 0, ausblenden);
    }

    private class MyWindowListener extends WindowAdapter {

        @Override
        public void windowClosing(WindowEvent e) {
            hideWindow();
        }

        @Override
        public void windowOpened(WindowEvent e) {
            showWindow();
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
            showWindow();
        }

        @Override
        public void windowIconified(WindowEvent e) {
            hideWindow();
        }
    }

    private class IconClickedListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e)  &&   remember.isVisible()) {
                hideWindow();
            }
            else if (SwingUtilities.isLeftMouseButton(e) && !remember.isVisible()){
                showWindow();
            }
        }
    }

    private class AnzeigenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            showWindow();
        }
    }

    private class AusblendenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            hideWindow();
        }
    }

    private class CloseProgram implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    }
}
 
Ein Fenster kann minimierte, maximierte oder normale Größe haben. Das steuert man mit setExtendedState(). Außerdem kann es sichtbar oder unsichtbar sein. Das steuert man mit setVisible(). Wenn ein Fenster gleichzeitig sichtbar und minimiert ist, sieht man's nicht, obwohl es sichtbar ist. Wenn ein Fenster unsichtbar und maximiert ist, sieht man's auch nicht, obwohl es riesengroß ist. Du mußt beide Einstellungen vernünftig setzen.
 
Wenn ein Fenster gleichzeitig sichtbar und minimiert ist, sieht man's nicht, obwohl es sichtbar ist. Wenn ein Fenster unsichtbar und maximiert ist, sieht man's auch nicht, obwohl es riesengroß ist. Du mußt beide Einstellungen vernünftig setzen.


Diese beiden Fälle treten bei mir doch gar nicht auf?

Java:
private class IconClickedListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            // sichtbar und offen
            if (SwingUtilities.isLeftMouseButton(e)  &&   remember.isVisible()) {

                hideWindow();
            }
            // nicht sichtbar und minimiert
            else if (SwingUtilities.isLeftMouseButton(e) && !remember.isVisible()){
                showWindow();
            }
        }
    }
 
Nein, wie gesagt, ich weiß einfach nicht, warum beim Klick auf das Icon, das Fenster nicht sichtbar/unsichtbar wird?
Die beiden Fälle, dass das Fenster unsichtbar und maximiert oder sichtbar und minimiert sind, treten nicht auf.
Daran kann es also auch nicht liegen.
Hier nochmal der aktuelle gesamte Code.

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;


public class TrayIconFeature {

    private Remember remember;
    private PopupMenu popup;
    private TrayIcon trayIcon = null;
    private MenuItem anzeigen;
    private MenuItem ausblenden;
    private MenuItem beenden;

    public TrayIconFeature(Remember remember) {
        this.remember = remember;
        {
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "Programm wird beendet, da das Betriebssystem kein TrayIcon unterstützt!", "Warnung", JOptionPane.WARNING_MESSAGE);
                System.exit(-1);
            }

            Image imageIcon = Toolkit.getDefaultToolkit().getImage("img/appdefault.png");
            SystemTray tray = SystemTray.getSystemTray();
            popup = new PopupMenu();

            anzeigen = new MenuItem(Constants.PROGRAM_NAME + " anzeigen");
            ausblenden = new MenuItem(Constants.PROGRAM_NAME + " ausblenden");
            beenden = new MenuItem(Constants.PROGRAM_NAME + " beenden");

            popup.add(anzeigen);
            popup.add(ausblenden);
            popup.addSeparator();
            popup.add(beenden);

            trayIcon = new TrayIcon(imageIcon, "Remember", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
        setupInteractions();
    }

    private void setupInteractions(){
        remember.addWindowListener(new MyWindowListener());
        trayIcon.addMouseListener(new IconClickedListener());
        anzeigen.addActionListener(new AnzeigenListener());
        ausblenden.addActionListener(new AusblendenListener());
        beenden.addActionListener(new CloseProgram());
    }

    private void editPopupMenu(MenuItem insert, int index, MenuItem remove) {
        popup.insert(insert, index);
        popup.remove(remove);
    }

    private void showWindow(){
        remember.setVisible(true);
        editPopupMenu(ausblenden, 0, anzeigen);
    }

    private void hideWindow(){
        remember.setVisible(false);
        editPopupMenu(anzeigen, 0, ausblenden);
    }

    private class MyWindowListener extends WindowAdapter {

        @Override
        public void windowClosing(WindowEvent e) {
            hideWindow();
        }

        @Override
        public void windowOpened(WindowEvent e) {
            showWindow();
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
            showWindow();
        }

        @Override
        public void windowIconified(WindowEvent e) {
            hideWindow();
        }
    }

    private class IconClickedListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            // sichtbar und offen
            if (SwingUtilities.isLeftMouseButton(e)  &&   remember.isVisible()) {

                hideWindow();
            }
            // nicht sichtbar und minimiert
            else if (SwingUtilities.isLeftMouseButton(e) && !remember.isVisible()){
                showWindow();
            }
        }
    }

    private class AnzeigenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            showWindow();
        }
    }

    private class AusblendenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            hideWindow();
        }
    }

    private class CloseProgram implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    }
}
 
Sieht so aus, als ob es jetzt funktioniert. 🙂
Danke für deine Hilfe.
Habe nur eine Zeile Code ergänzt.

Java:
private void showWindow(){
        remember.setVisible(true);
        remember.setExtendedState(Frame.NORMAL);
        editPopupMenu(ausblenden, 0, anzeigen);
    }


Du hast mir noch empfohlen einen WindowStateListener zu benutzen, um den Fensterstatus zwischen zuspeichern.
Wenn ich aber an der Fenstergröße rumspiele und dann das Fenster minimiere/maximiere, dann kehrt die Fenstergröße nicht mehr auf Normalgröße um.
Wäre so ein WindowStateListener also nicht unnötig?
 
Kommt darauf an, wie dein Programm sich verhalten soll. Wenn unabhängig vom vorherigen Status immer in Normalgröße eingeblendet werden soll, ist es unnötig. Wenn es nach dem Einblenden denselben Status wie vor dem Ausblenden haben soll, ist es sinnvoll.
 
Nein, sorry ich habe nur die Fenstergröße geändert.
Mir ist erst gerade aufgefallen, dass es beim Maximieren nicht funktioniert.

Jedenfalls, habe ich versucht das zu programmieren und auch google gefragt. Habe aber keine zufriedenstellende Ergebnisse erhalten. Nur eine Beschreibung der Methode in der API und weitere Links, die aber nicht mein Problem lösen.

https://www.google.de/search?q=java...fox-b&gfe_rd=cr&dcr=0&ei=9Qk3Wre4CtHCXsHgutgE

Vielleicht hab ich auch nicht die richtigen Begriffe benutzt?
Es wird nicht mal in die windowStateChanged Methode gesprungen.

Java:
@Override
    public void windowStateChanged(WindowEvent e) {
        System.out.println("windowStateChanged");
        if(e.getOldState()==JFrame.MAXIMIZED_BOTH){
            remember.setExtendedState(e.getOldState());
        }

    }
 
Ich bin mir nicht sicher, wie ich das mit dem windowStateChanged Listener programmieren soll.
So sieht mein aktueller Code aus:

Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;


public class TrayIconFeature{

    private Remember remember;
    private PopupMenu popup;
    private TrayIcon trayIcon = null;
    private MenuItem anzeigen;
    private MenuItem ausblenden;
    private MenuItem beenden;

    public TrayIconFeature(Remember remember) {
        this.remember = remember;
        {
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "Programm wird beendet, da das Betriebssystem kein TrayIcon unterstützt!", "Warnung", JOptionPane.WARNING_MESSAGE);
                System.exit(-1);
            }

            Image imageIcon = Toolkit.getDefaultToolkit().getImage("img/appdefault.png");
            SystemTray tray = SystemTray.getSystemTray();
            popup = new PopupMenu();

            anzeigen = new MenuItem(Constants.PROGRAM_NAME + " anzeigen");
            ausblenden = new MenuItem(Constants.PROGRAM_NAME + " ausblenden");
            beenden = new MenuItem(Constants.PROGRAM_NAME + " beenden");

            popup.add(anzeigen);
            popup.add(ausblenden);
            popup.addSeparator();
            popup.add(beenden);

            trayIcon = new TrayIcon(imageIcon, "Remember", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
        setupInteractions();
    }

    private void setupInteractions(){
        remember.addWindowListener(new MyWindowListener());
        trayIcon.addMouseListener(new IconClickedListener());
        anzeigen.addActionListener(new AnzeigenListener());
        ausblenden.addActionListener(new AusblendenListener());
        beenden.addActionListener(new CloseProgram());
        remember.addWindowStateListener(new WindowStateListener() {
            @Override
            public void windowStateChanged(WindowEvent e) {
                System.out.println("windowStateChanged");
                if(e.getOldState()==JFrame.MAXIMIZED_BOTH){
                    remember.setExtendedState(JFrame.MAXIMIZED_BOTH);
                }
            }
        });
    }

    private void editPopupMenu(MenuItem insert, int index, MenuItem remove) {
        popup.insert(insert, index);
        popup.remove(remove);
    }

    private void showWindow(){
        remember.setVisible(true);
        // Benötigt man, da das Fenster gleichzeitig minimiert und unsichtbar ist.
        // Mit setVisible(true) ist das Fenster zwar sichtbar aber gleichzeitig auch minimiert.
        // Deswegen reicht setVisible(true) alleine nicht aus.
        remember.setExtendedState(Frame.NORMAL);
        editPopupMenu(ausblenden, 0, anzeigen);
    }

    private void hideWindow(){
        remember.setVisible(false);
        editPopupMenu(anzeigen, 0, ausblenden);
    }

    private class MyWindowListener extends WindowAdapter {

        @Override
        public void windowClosing(WindowEvent e) {
            hideWindow();
        }

        @Override
        public void windowOpened(WindowEvent e) {
            showWindow();
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
            showWindow();
        }

        @Override
        public void windowIconified(WindowEvent e) {
            hideWindow();
        }
    }

    private class IconClickedListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e)  &&   remember.isVisible()) {
                hideWindow();
            }
            else if (SwingUtilities.isLeftMouseButton(e) && !remember.isVisible()){
                showWindow();

            }
        }
    }

    private class AnzeigenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            showWindow();
        }
    }

    private class AusblendenListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            hideWindow();
        }
    }

    private class CloseProgram implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    }
}

Außerdem habe ich keine Methode gefunden, die die Menüpunkte deaktiviert und aktiviert anstatt entfernt und einfügt.
 
Ich bin mir nicht sicher, wie ich das mit dem windowStateChanged Listener programmieren soll.
Du könntest bei jeder Statusänderung, die keine Minimierung ist, den neuen Status in einer Variablen sichern und beim Einblenden wieder auf den dort gesicherten Wert zurück setzen.
Außerdem habe ich keine Methode gefunden, die die Menüpunkte deaktiviert und aktiviert anstatt entfernt und einfügt.
menuItem.setEnabled();
 
Ok, sorry für diese Frage aber das ist mein erstes Projekt und habe noch wenig Erfahrunge im programmieren.

1) So, wie es aussieht behält das Fenster immer seine letzte Größe außer beim Minimieren. Das heißt, wenn auf den Minimieren Button geklickt wird, soll die Position und die Größe des Fensters gespeichert werden.

2) Und beim Aufruf der Methode showWindow sollen die gespeicherten Werte gesetzt werden. Dann müsste es klappen.

Ich weiß aber nicht, wie ich die Koordinaten und die Größe vom Fenster bekomme.
Und falls ich die Werte habe, soll ich alle Werte in int Variablen speichern?
 
Ich weiß aber nicht, wie ich die Koordinaten und die Größe vom Fenster bekomme.
Und falls ich die Werte habe, soll ich alle Werte in int Variablen speichern?
Ich glaube, die brauchst du gar nicht, sondern nur eine für den Fenster-Status. Wenn man zwischen den Status "maximiert", "minimiert" und "normal" umschaltet, werden im Status "normal" automatisch die ursprüngliche Dimension usw. wieder hergestellt. Du musst dir nur im richtigen Moment den gewünschten Status merken und im richtigen Moment wieder darauf zurück setzen.

Der richtige Zeitpunt zum Speichern des Status ist die Ereignisbehandlung des WindowStateChanged-Events. Dort hast du den alten und den neuen Status zur Verfügung. Du kannst den neuen Status einfach jedes Mal, wenn er nicht dem Wert "minimiert" entspricht in deine Hilfsvariable schreiben. Andernfalls tust du gar nichts. Wenn dann mal eine Minimierung stattgefunden hat, steht in deiner Hilfsvariablen noch der Wert der vorherigen Statusänderung, was dann ja genau der gewünschte Wert ist. Beim Einblenden kannst du den Status dann also einfach darauf zurück setzen.
 

Neue Themen


Zurück
Oben