doppelte Ausführung bei einfachem Mausklick!

AWT, Swing, JavaFX & SWT: doppelte Ausführung bei einfachem Mausklick!

Themen zur Programmierung von Benutzer-Oberflächen (GUI, Applet) sowie zur Grafikprogrammierung (2D / 3D)
12
  1. doppelte Ausführung bei einfachem Mausklick! #1
    ReatKay


    doppelte Ausführung bei einfachem Mausklick! - Standard doppelte Ausführung bei einfachem Mausklick!
    Moin zusammen

    Ich hab da grad wieder mal eine "seltsame Erscheinung".

    Ich habe ein Panel, dieses Panel hat einen MouseListener zugewiesen bekommen und bei MouseReleased sollte ein gewisser Code ausgeführt werden - komischerweise wird das immer zwei mal ausgeführt!?

    Der MouseListener
    Code:
    public class clickController implements MouseListener
    {
        public clickController()
        {
    
        }
    
        public void mouseClicked(MouseEvent arg0)
        {
            
        }
    
        public void mousePressed(MouseEvent arg0)
        {
            
           
        }
    
        public void mouseReleased(MouseEvent arg0)
        {
            if (arg0.getButton() == 1)
            {
                 System.out.println(" Links-Klick: " + arg0.getPoint());
    
                 System.out.println("Feld: x" + arg0.getX()/50 + " y" + arg0.getY()/50 );
    
                 realPlayer.setSelection(arg0.getX()/50,arg0.getY()/50);
            }
            else if (arg0.getButton() == 3)
            {
                System.out.println(" Rechts-Klick: " + arg0.getPoint());
    
                System.out.println(realPlayer.getSelectionX() + " " + arg0.getX()/50 + " " + realPlayer.getSelectionY() + arg0.getY()/50);
    
                if ((arg0.getX()/50 == realPlayer.getSelectionX()) && (arg0.getY()/50 == realPlayer.getSelectionY()))
                {
    
                }
                else
                {
                    gameWindow.getInstance().showStandardFieldPopup(arg0);
                }
            }
        }
    Mein JFrame welches das besagte Panel "mapPanel" beinhaltet
    Code:
    public class gameWindow extends JFrame
    {
        public static gameWindow instance = null;
    
        private JPanel container = new JPanel();
        private JMenuBar mainMenu = new JMenuBar();
        private JMenu gameMenu = new JMenu();
        private JPanel top  = new JPanel();
        private mapPanel map = new mapPanel();
        private JPanel mainContent = new JPanel();
        private JScrollPane sub = new JScrollPane(map);
        private JPopupMenu standPop = new JPopupMenu();
    
        public static gameWindow getInstance()
        {
            if (gameWindow.instance == null)
            {
                gameWindow.instance = new gameWindow();
            }
    
            return gameWindow.instance;
        }
    
        private gameWindow()
        {
            this.setUndecorated(true);
    
    
            initWindow();
        }
    
        public void initWindow()
        {
            this.setTitle("Sunburst    (c) 2008 by Royal Flush Entertainment");
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            
            this.setBackground(new Color(0,0,0));
            this.setLayout(new FlowLayout());
    
            // Vollbild-Modus simulieren
            graphicsDeviceController.getInstance().setFullscreenMode(this);
    
            // Container-Panel vorbereiten (Container-Panel)
            this.container.setSize(1280,1024);
            this.container.setSize(1280,1024);
            this.container.setPreferredSize(new Dimension(1280,1024));
            this.container.setMinimumSize(new Dimension(1280,1024));
            this.container.setBackground(new Color(0,0,0));
            this.container.setBorder(new LineBorder(new Color(0,0,0)));
    
            // Map-Panel vorbereiten
            this.map.setSize(5000,5000);
            this.map.setPreferredSize(new Dimension(5000,5000));
            this.map.setMinimumSize(new Dimension(5000,5000));
            this.map.setBackground(new Color(0,0,0));
            this.map.addMouseListener(new clickController()); // Hier wird der Listener aufs Panel gesetzt
    
            // Main Content Panel (incl: SubPanel, RightInfoPanel
            this.mainContent.setLayout(new BorderLayout());
            this.mainContent.setSize(1280,580);
            this.mainContent.setPreferredSize(new Dimension(1280,580));
            this.mainContent.setMinimumSize(new Dimension(1280,580));
            this.mainContent.setBackground(new Color(0,0,0));
            this.mainContent.setBorder(new LineBorder(new Color(0,0,0)));
    
            // Subpanel (Scrollpane für MapPanel)
            this.sub.setSize(1080,568);
            this.sub.setPreferredSize(new Dimension(1080,568));
            this.sub.setMinimumSize(new Dimension(1080,568));
            this.sub.setBackground(new Color(0,0,0));
            this.sub.setBorder(new LineBorder(new Color(0,0,0)));
    
            // Top Panel (für Spielinfos)
            this.top.setSize(1280,100);
            this.top.setPreferredSize(new Dimension(1280,100));
            this.top.setMinimumSize(new Dimension(1280,100));
            this.top.setBackground(new Color(0,0,0));
            this.top.setBorder(new LineBorder(new Color(0,0,0)));
    
            this.mainMenu.setBorderPainted(false);
            this.mainMenu.setBackground(new Color(0,0,0));
    
            JMenuItem fieldInfo = new JMenuItem();
            fieldInfo.setText("Field Info");
    
    
            this.standPop.add(fieldInfo);
    
    
            // Panels hinzufügen
            this.container.add(mainMenu);
                this.gameMenu.setText("Game");
                
                this.mainMenu.add(this.gameMenu);
    
            this.add(this.standPop);
    
    
            this.mainContent.add(sub, java.awt.BorderLayout.WEST);
            this.container.add(this.top);
            this.container.add(this.mainContent);
            this.add(container);
    
    
            this.setEnabled(true);
            this.setVisible(true);
        }
        
        public void showStandardFieldPopup(MouseEvent e)
        {
            this.standPop.show(e.getComponent(),e.getX(),e.getY());
        }
    }
    Sieht jemand einen Fehler der für dieses Verhalten verantwortlich ist?

    Gruss & Danke
    RoyalFlush[/code]

  2. doppelte Ausführung bei einfachem Mausklick! #2
    SlaterB

    vielleicht zwei derartige Listener eingefügt?
    schreibe System.out.println()-Meldungen in den Listener und gib die Quelle + den HashCode des Listeners aus

  3. doppelte Ausführung bei einfachem Mausklick! #3
    ReatKay


    Habe den Listener nur einmal eingebaut... die HashCodes sind identisch Oo

  4. doppelte Ausführung bei einfachem Mausklick! #4
    SlaterB

    vereinfache dein Programm Schritt für Schritt, wirf nicht benötigte Komponenten wie JPopupMenu, JMenuBar und JScrollBar raus,
    entferne irrelevante Panel und Aufrufe wie setBorder() oder setColor(),

    wenn du dann irgendwann ein handlich kleines und auch lesbares Programm hast, in dem der Fehler immer noch auftritt,
    dann poste das

  5. doppelte Ausführung bei einfachem Mausklick! #5
    ReatKay


    so hier das "handliche" Programm, immernoch mit dem selben Fehler

    Das Frame:
    Code:
    public class gameWindow extends JFrame
    {
        public static gameWindow instance = null;
    
        private mapPanel map = new mapPanel();
    
        public static gameWindow getInstance()
        {
            if (gameWindow.instance == null)
            {
                gameWindow.instance = new gameWindow();
            }
    
            return gameWindow.instance;
        }
    
        private gameWindow()
        {
    
            initWindow();
        }
    
        public void initWindow()
        {
            this.setTitle("Sunburst    (c) 2008 by Royal Flush Entertainment");
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            
            this.setLayout(new FlowLayout());
    
            
            // Map-Panel vorbereiten
            this.map.setSize(5000,5000);
            this.map.setPreferredSize(new Dimension(5000,5000));
            this.map.setMinimumSize(new Dimension(5000,5000));
           
            this.map.addMouseListener(new clickController());
            this.add(map);
            
    
            this.setEnabled(true);
            this.setVisible(true);
        }
    }
    Das MapPanel:
    Code:
    class mapPanel extends JPanel
    {
        @Override
        public void paint(Graphics g)
        {
           for (int x = 0 ; x < 100 ; x++)
           {
               for (int y = 0 ; y < 100 ; y++)
               {
                   g.setColor(new Color(131,139,139));
                   g.drawRect(50*y,50*x,50,50);
                   g.setColor(new Color(0,0,0));
                   g.fillRect(((50*y)+1),((50*x)+1),49,49);
               }
    
           }
    
           if (realPlayer.getSelectionX() >= 0 && realPlayer.getSelectionY() >= 0)
           {
                   g.setColor(new Color(30,144,255));
                   g.drawRect(realPlayer.getSelectionX()*50, realPlayer.getSelectionY()*50, 50, 50);
            }
        }
    }
    Der MouseListener:
    Code:
    public class clickController implements MouseListener
    {
        public clickController()
        {
    
        }
    
        public void mouseClicked(MouseEvent arg0)
        {
            
        }
    
        public void mousePressed(MouseEvent arg0)
        {
            
           
        }
    
        public void mouseReleased(MouseEvent arg0)
        {
            if (arg0.getButton() == 1)
            {
                 System.out.println(" Links-Klick: " + arg0.getPoint());
    
                 realPlayer.setSelection(arg0.getX()/50,arg0.getY()/50);
            }
            else if (arg0.getButton() == 3)
            {
                System.out.println(" Rechts-Klick: " + arg0.getPoint());
            }
        }
    
        public void mouseEntered(MouseEvent arg0) 
        {
    
        }
    
        public void mouseExited(MouseEvent arg0) 
        {
    
        }
    
    }
    [/code]

  6. doppelte Ausführung bei einfachem Mausklick! #6
    Marco13


    Bei mir erscheint die Meldung bei jedem Klick nur einmal. Maus kaputt?

  7. doppelte Ausführung bei einfachem Mausklick! #7
    SlaterB

    tja, größter anzunehmender Unfall, Fehler nicht reproduzierbar,

    mit folgendem Listener
    public void mouseReleased(MouseEvent arg0)
    {
    System.out.println(System.currentTimeMillis() + ", Button: " + arg0.getButton() + ", " + arg0.getClickCount());
    }


    erhalte ich die Ausgabe
    1217508137546, Button: 3, 1
    1217508138625, Button: 3, 1
    1217508139984, Button: 1, 1
    1217508141265, Button: 1, 1

    wie sieht sie bei dir aus?

  8. doppelte Ausführung bei einfachem Mausklick! #8
    ReatKay


    Mhn, ich hab grad mal 2 andre Mäuse getestet:

    Interessant: Mit der Kabelmaus läuft es einwandfrei (nur 1 Klick registriert)
    mit den Wireless-Mäusen: Jeweils immer 2 Klicks

    Möglicherweise eine Fehlproduktion von Logitech harhar

    danke euch für eure Hilfe

  9. doppelte Ausführung bei einfachem Mausklick! #9
    ReatKay


    Versuche gerade, das Problem irgendwie zu umgehen - für den Fall, dass auch andere Wireless-Maus-Besitzer in der finalen Version mit dem selben Problem zu kämpfen haben.

    Egal was ich mache (sei es mit einer boolean setzen oder sonstwas), bringt alles nix - da (so verstehe ich es), das ganze nahezu Paraellel abläuft...

    Hat jemand einen Vorschlag, wie ich diesen ungewollten Doppelaufruf in den Griff kriege?

  10. doppelte Ausführung bei einfachem Mausklick! #10
    SlaterB

    vergleiche die Systemzeit (System.currentTimeInMillies()) + den ClickCount dieses Doppelereignisses verglichen mit einem normalen Doppelklick,
    (siehe mein Posting)

    wenn deine Anwendung gar keine Doppelklicks unterstützt,
    dann kannst du noch eher alle weiteren Klicks innerhalb der nächsten x Millisekunden nach einem akzeptierten Klick ignorieren

12
  • Javavideokurs
    Videokurs
    Dein Weg zum Java-Profi!
    25 Stunden geballtes Java Know-How.

    Videokurs

  • Ähnliche Themen zu doppelte Ausführung bei einfachem Mausklick!
    1. Cast Exception bei einfachem RMI Beispiel
      Von auxilium im Forum Netzwerkeprogrammierung
      Antworten: 3
      Letzter Beitrag: 01.12.2012, 15:35
    2. Doppelte Ausführung von KeyPressed
      Von Oli im Forum AWT, Swing, JavaFX & SWT
      Antworten: 7
      Letzter Beitrag: 28.08.2009, 11:43
    3. SQLGrammarException in einfachem Beispiel
      Von boxi im Forum Data Tier
      Antworten: 2
      Letzter Beitrag: 22.08.2008, 10:14
    4. Verwirrung bei einfachem Integral
      Von integralFuzzi im Forum Mathematik
      Antworten: 4
      Letzter Beitrag: 26.07.2007, 16:17
    5. Problem mit einfachem TXT-Editor
      Von Gravity im Forum Java Basics - Anfänger-Themen
      Antworten: 2
      Letzter Beitrag: 10.04.2005, 22:33
    Sie betrachten gerade doppelte Ausführung bei einfachem Mausklick!