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());
}
 

truesoul

Top Contributor
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
 

programmierer123

Aktives Mitglied
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:

Meniskusschaden

Top Contributor
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.
 

programmierer123

Aktives Mitglied
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);
        }
    }

}
 

truesoul

Top Contributor
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.
 

Meniskusschaden

Top Contributor
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.
 

programmierer123

Aktives Mitglied
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);
        }
    }

}
 

programmierer123

Aktives Mitglied
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);
            }
        }
    }
 

programmierer123

Aktives Mitglied
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:

programmierer123

Aktives Mitglied
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);
        }
    }

}
 

Meniskusschaden

Top Contributor
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.
 

programmierer123

Aktives Mitglied
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);
        }
    }
}
 

Meniskusschaden

Top Contributor
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.
 

programmierer123

Aktives Mitglied
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();
            }
        }
    }
 

programmierer123

Aktives Mitglied
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);
        }
    }
}
 

Meniskusschaden

Top Contributor

programmierer123

Aktives Mitglied
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?
 

Meniskusschaden

Top Contributor
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.
 

programmierer123

Aktives Mitglied
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());
        }

    }
 

programmierer123

Aktives Mitglied
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.
 

Meniskusschaden

Top Contributor
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();
 

programmierer123

Aktives Mitglied
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?
 

Meniskusschaden

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
D String value change listener Java Basics - Anfänger-Themen 2
topi WindowAdapter / Listener / Event Java Basics - Anfänger-Themen 4
L Problem mit Listener Java Basics - Anfänger-Themen 0
Salo JTabel Selection listener Bsp. Java Basics - Anfänger-Themen 3
W JLabel, Farbe durch Listener ändern Java Basics - Anfänger-Themen 6
M Listener für Button - Wert von Variablen verändern Java Basics - Anfänger-Themen 14
V JTable welcher Listener ? Java Basics - Anfänger-Themen 7
J Verständnis Problem Java-Listener. Java Basics - Anfänger-Themen 59
M Compiler-Fehler Using action listener Java Basics - Anfänger-Themen 1
F Listener schreiben Java Basics - Anfänger-Themen 1
P Eigene Knöpfe mit eigenem Listener Java Basics - Anfänger-Themen 5
B Listener beim Laden (deserialize) wieder hinzufügen bzw. mitspeichern? Java Basics - Anfänger-Themen 3
J Listener Java Basics - Anfänger-Themen 4
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
llabusch Kombinationsfeld - LISTENER Java Basics - Anfänger-Themen 0
S Eigenen Listener zu eigenen Button! Java Basics - Anfänger-Themen 5
S Listener reagieren nicht mehr Java Basics - Anfänger-Themen 3
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
E Mein eigener Listener (Hilfe gesucht) Java Basics - Anfänger-Themen 2
K On Click listener Problem Java Basics - Anfänger-Themen 4
L JTextField/Listener Input Problem Java Basics - Anfänger-Themen 2
M Listener einerm JPanel hinzufuegen Java Basics - Anfänger-Themen 3
G Listener ohne Objekt Java Basics - Anfänger-Themen 5
T Button Text mit Action Listener [Hilfe!] Java Basics - Anfänger-Themen 10
H Eigenen Listener einbauen Java Basics - Anfänger-Themen 5
K Key Listener bei 2 gleichzeitig gedrückten tasten Java Basics - Anfänger-Themen 3
M Bäume und Listener Java Basics - Anfänger-Themen 2
K Erste Schritte table Listener noob frage Java Basics - Anfänger-Themen 3
E eigenständige Listener-Klasse Java Basics - Anfänger-Themen 9
T Motion listener Java Basics - Anfänger-Themen 10
U Listener erstellen Java Basics - Anfänger-Themen 16
N Variablen aus Action Listener lesen und weiterverarbeiten Java Basics - Anfänger-Themen 12
M listener Java Basics - Anfänger-Themen 16
L Listener Problem in Klasse Java Basics - Anfänger-Themen 8
P Listener für mehrere Buttons Java Basics - Anfänger-Themen 3
L Window Listener Java Basics - Anfänger-Themen 2
Kenan89 JTable: Listener Java Basics - Anfänger-Themen 4
N Klassen auf den Action Listener in einer andere Klasse zugreifen Java Basics - Anfänger-Themen 6
A action listener Java Basics - Anfänger-Themen 8
M Netbeans Listener - Anonymous, inner class, main class? Java Basics - Anfänger-Themen 4
K Action Listener reagiert nicht auf Button druck mehr??? Java Basics - Anfänger-Themen 4
E Mehrere Listener auf einen Button? Java Basics - Anfänger-Themen 3
P Input/Output InputStream Listener? Java Basics - Anfänger-Themen 7
X Problem bezüglich Key Listener Java Basics - Anfänger-Themen 3
Y Button hört nicht auf Listener Java Basics - Anfänger-Themen 5
H JTable, Listener und CellEditor Java Basics - Anfänger-Themen 8
H Listener und Events entfernen Java Basics - Anfänger-Themen 2
B OOP Eigener Event-Listener erstellen Java Basics - Anfänger-Themen 4
M Listener Objekte Java Basics - Anfänger-Themen 12
S Applet Key Listener Java Basics - Anfänger-Themen 6
J Action Listener Java Basics - Anfänger-Themen 2
G Probleme mit Listener Java Basics - Anfänger-Themen 27
B Wert einer Variable mit Listener ueberwachen Java Basics - Anfänger-Themen 3
F Port Listener Java Basics - Anfänger-Themen 9
J JComboBox Listener Java Basics - Anfänger-Themen 6
J Window-Listener funktionieren nicht Java Basics - Anfänger-Themen 7
N Frage zu Listener für Textfelder Java Basics - Anfänger-Themen 5
Benji0815 Eigenen Listener schreiben Java Basics - Anfänger-Themen 13
M Probleme beim Aufruf von Listener in anderer Klasse Java Basics - Anfänger-Themen 9
S Key-Listener richtig "einbauen" Java Basics - Anfänger-Themen 42
S Listener von ausserhalb aufrufen Java Basics - Anfänger-Themen 2
S Action Listener Java Basics - Anfänger-Themen 6
Sweety Listener in Swing Java Basics - Anfänger-Themen 8
Hamstinator Design und Listener in verschiedenen Klassen Java Basics - Anfänger-Themen 6
Developer_X Mouse MOTION listener example Java Basics - Anfänger-Themen 5
J Mouse-Listener Java Basics - Anfänger-Themen 3
I Listener Klassen in Package Java Basics - Anfänger-Themen 3
StickToFreak Applet -> GameLoop + Listener / Listener funktioniert nicht Java Basics - Anfänger-Themen 22
B externer Listener für Zeichenbereich? Java Basics - Anfänger-Themen 2
D dialog listener? Java Basics - Anfänger-Themen 2
G Key Listener arbeitet Fehlerhaft Java Basics - Anfänger-Themen 6
C Listener und Events Java Basics - Anfänger-Themen 10
E Listener Java Basics - Anfänger-Themen 2
hdi keylistener hat keinen fokus oder: listener ohne frame? Java Basics - Anfänger-Themen 10
G jtable listener wenn zeile markiert wird Java Basics - Anfänger-Themen 6
S Action Listener Funktioniert nicht Java Basics - Anfänger-Themen 6
D Kombinationsfeld => Realisierung im Listener? Java Basics - Anfänger-Themen 2
G LIstener bei JavaMail Java Basics - Anfänger-Themen 2
G Context Listener des Apache Tomcat verwenden Java Basics - Anfänger-Themen 4
D Listener bzw. Interfaces Java Basics - Anfänger-Themen 7
A Wo/Wie Event Listener Java Basics - Anfänger-Themen 3
G Window Listener? Java Basics - Anfänger-Themen 2
G 2 Listener wiedersprechen sich. Java Basics - Anfänger-Themen 12
G Listener für JPanel für Statusmeldungen Java Basics - Anfänger-Themen 3
F Listener für Variable Java Basics - Anfänger-Themen 29
A Gibt es standardmässig in Java einen Verzeichnis-Listener? Java Basics - Anfänger-Themen 6
N Listener für datei Java Basics - Anfänger-Themen 13
S Mit Listener AWT Objekte ansprechen Java Basics - Anfänger-Themen 2
G listener für radiobutton Java Basics - Anfänger-Themen 1
G Listener Java Basics - Anfänger-Themen 5
G Listener Problem Java Basics - Anfänger-Themen 3
B Wiso funktioniet das nicht? (Listener) Java Basics - Anfänger-Themen 6
H Key Listener macht nicht das was er soll Java Basics - Anfänger-Themen 4
T Wartet Klasse auf Listener? Java Basics - Anfänger-Themen 3
D Listener? Java Basics - Anfänger-Themen 2
S Listener auf JTextfeld Java Basics - Anfänger-Themen 8
B Kommunikation zwischen Klasse und Listener Java Basics - Anfänger-Themen 2
C Benutzereingaben vor Listener abfangen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben