Event Handling ActionListener nur bei "checked" CheckBoxMenuItem

VinCash

Mitglied
Hallo Leute,
Ich hoffe, ich habe meinen ersten Post richtig in der Forenstruktur eingeordnet.
Nun zum Problem: Ich möchte an das Aktivieren also "checken" eines CheckBoxMenuItem meiner MenuBar ein MouseEvent koppeln. Dies soll demnach nur dann aktiviert bzw. ausgeführt werden, wenn ich das MenuItem angewählt habe und wieder deaktiviert werden, wenn ich nochmals draufklicke (der Haken wieder verschwunden ist).

Nun habe ich ein Panel erstellt, auf dem die Maus aktiv sein kann, mit einer Statusleiste am unteren Rand. Wenn ich mit meinem aktuellen Code das CheckBoxMenuItem aktiviere funktioniert auch alles wie gewünscht, nur das Deaktivieren bereitet mir Probleme - das klappt einfach nicht.

Im Folgenden der Code, ich hoffe, der ist nicht zu lang:

Java:
public class MenuBar extends JFrame{
    private JLabel statusBar;
    private JPanel mousePanel;
   
    private class HandlerClass implements MouseListener, MouseMotionListener {
        // Mouse events for MouseListener
        public void mouseClicked(MouseEvent event) {
            statusBar.setText(String.format("Clicked at %d %d", event.getX(), event.getY()));
        }
       
        public void mousePressed(MouseEvent event) {
            statusBar.setText("You pressed down the mouse");
        }
       
        public void mouseReleased(MouseEvent event) {
            statusBar.setText("You released the mouse button");
        }
       
        public void mouseEntered(MouseEvent event) {
            statusBar.setText("You entered the area");
            mousePanel.setBackground(Color.RED);
        }
       
        public void mouseExited(MouseEvent event) {
            statusBar.setText("The mouse has left the window");
            mousePanel.setBackground(Color.WHITE);
        }
       
        // Mouse events for MouseMotionListener
        public void mouseDragged(MouseEvent event) {
            statusBar.setText("You are dragging the mouse");
        }
       
        public void mouseMoved(MouseEvent event) {
            statusBar.setText("X: " + event.getX() + "\t Y: " + event.getY());
        }
    }
   
   

    public static void main(String[] args) {
           MenuBar me = new MenuBar();
           me.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           me.setVisible(true);
    }
   
    public MenuBar() {       
        //Set frame
        setTitle("Menu");
        setSize(700, 700);
       
        //Create the mouse panel
        mousePanel = new JPanel();
        mousePanel.setBackground(Color.WHITE);
        add(mousePanel, BorderLayout.CENTER);
       
        //Create status bar
        statusBar = new JLabel("default");
        add(statusBar, BorderLayout.SOUTH);
       
        //Create menu bar
        JMenuBar menuBar = new JMenuBar();
       
        //Add menu bar to the frame
        setJMenuBar(menuBar);
       
        //Define and add two drop down menus to the frame
        JMenu fileMenu = new JMenu("Data");
        JMenu editMenu = new JMenu("Edit");
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
       
        //Create and add simple menu items to the drop down menu
        JMenuItem openItem = new JMenuItem("Open CSV");
        JMenuItem newItem = new JMenuItem("New");
        JMenuItem exitItem = new JMenuItem("Exit");
        JMenuItem copyItem = new JMenuItem("Copy");
        JCheckBoxMenuItem clickItem = new JCheckBoxMenuItem("Mouse GPS");
       
        fileMenu.add(openItem);
        fileMenu.add(newItem);
        fileMenu.add(exitItem);
        editMenu.add(copyItem);
        editMenu.add(clickItem);
       
        /* Add Listener to the menu bar
         * PerformedAction will be invoked if button is clicked
         */
                      // File chooser pops up if "Open" is clicked
           openItem.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                   // Creates a file filter to the pop up menu, so that only CSV files are choosable
                   FileFilter csvFilter = new FileNameExtensionFilter("CSV", "csv");
                   JFileChooser fileJuice = new JFileChooser();
                   // Adds and sets the created file filter to default
                   fileJuice.addChoosableFileFilter(csvFilter);
                   fileJuice.setFileFilter(csvFilter);
                   fileJuice.showOpenDialog(null);
                   //Adds "Open" to the menu dialog
                   fileJuice.setDialogType(JFileChooser.OPEN_DIALOG);
                   //Opens selected File                                           
                   String thatFilePath = fileJuice.getSelectedFile().getAbsolutePath();
                   CSVReader csvOne = new CSVReader(thatFilePath);
                   csvOne.CSV();
               }
           });
          
           exitItem.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                   System.exit(0);
               }
           });
          
           //Add new handler
           HandlerClass mouseHandler = new HandlerClass();
                     
           clickItem.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                   if (clickItem.getState() == true) {
                       mousePanel.addMouseListener(mouseHandler);
                       mousePanel.addMouseMotionListener(mouseHandler);
                   }
                   else if (clickItem.getState() == false) {
                       statusBar.setText("Mouse Mode OFF");
                   }
               }
           });
    }
}

Vielen Dank schonmal für eure Hilfe!
 

VinCash

Mitglied
Das war jetzt ein eher kurzes Intermezzo. Meine Lösung für das Problem hier:

Java:
clickItem.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                   if (clickItem.getState() == true) {
                       mousePanel.addMouseListener(mouseHandler);
                       mousePanel.addMouseMotionListener(mouseHandler);
                   }
                   else if (clickItem.getState() == false) {
                       mousePanel.removeMouseListener(mouseHandler);
                       mousePanel.removeMouseMotionListener(mouseHandler);
                       statusBar.setText("Mouse Mode OFF");
                   }
               }
           });

Falls noch jemand eine andere Lösung kennt, bin ich sehr daran interessiert!
 

Thallius

Top Contributor
Warum fragst du den Status der Checkbox nicht einfach im Mousehandler selber ab und machst einfach nichts wenn sie nicht gesetzt ist? Das spart es Dir jedesmal den Handler hinzuzufügen und wieder rauszunehmen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JButton und ActionListener Allgemeine Java-Themen 3
F System Tray Menubutton ActionListener Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
C ActionListener - ToggleButton als von KI geklickt "markieren" Allgemeine Java-Themen 2
A ActionListener blockiert Bedienung des ganzen Systems Allgemeine Java-Themen 8
Z Swing Problem mit ActionListener Allgemeine Java-Themen 6
X getText undefiniert in ActionListener Allgemeine Java-Themen 5
D ActionListener wird mit jedem Mal öfter aufgerufen Allgemeine Java-Themen 2
P Variablen Variable von void im ActionListener verwenden Allgemeine Java-Themen 3
F Swing NetBeans nimmt ActionListener nicht an. Allgemeine Java-Themen 2
C Event Handling ActionListener manuell auslösen Allgemeine Java-Themen 8
G Button-Registrierung beim ActionListener erst NACH Tastendruck Allgemeine Java-Themen 2
P ActionListener / Label Name auslesen Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
T ActionListener und Singleton Allgemeine Java-Themen 15
J ActionListener-Klasse will Methode nicht annehmen Allgemeine Java-Themen 6
G Übergabeparameter an ActionListener Allgemeine Java-Themen 9
Z Mit ActionListener in anderem Frame lauschen? Allgemeine Java-Themen 3
W 2 Klassen + ActionListener Allgemeine Java-Themen 2
G Anonymen Buttons in for schleife ActionListener hinzufügen Allgemeine Java-Themen 5
C JTree: ActionListener auf die Nodes Allgemeine Java-Themen 3
C ActionListener reagiert zu oft Allgemeine Java-Themen 5
MQue ActionListener und GUI trennen Allgemeine Java-Themen 3
L ActionListener / Buttons Allgemeine Java-Themen 8
E ActionListener Allgemeine Java-Themen 8
TheJavaKid Programmablauf anhalten bis actionlistener ausgeführt wurde Allgemeine Java-Themen 6
minzel ActionListener aus Package Allgemeine Java-Themen 24
F AbstractAction und ActionListener Allgemeine Java-Themen 2
J variablen wert ändernung mit einer art actionlistener? Allgemeine Java-Themen 4
K ActionListener ohne implements? Allgemeine Java-Themen 2
L ActionListener > Variable ... u.v.m. Allgemeine Java-Themen 19
W ActionListener + Klasse einbinden Allgemeine Java-Themen 2
S Double-Checked Locking Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben