java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > AWT, Swing, JavaFX & SWT

AWT, Swing, JavaFX & SWT Themen zur Programmierung von Benutzer-Oberflächen (GUI, Applet) sowie zur Grafikprogrammierung (2D / 3D)

Thema geschlossen    
Themen-Optionen Thema durchsuchen Ansicht
Alt 31.07.2008, 12:42   #1 (permalink)
Benutzer
int
 
Registriert seit: 24.04.2007
Fachbeiträge: 38
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
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]
ReatKay ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.07.2008, 12:51   #2 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.637
Abgegebene Danke: 0
Erhielt 2.565 Danke für 2.526 Beiträge
vielleicht zwei derartige Listener eingefügt?
schreibe System.out.println()-Meldungen in den Listener und gib die Quelle + den HashCode des Listeners aus
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.07.2008, 13:05   #3 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 24.04.2007
Fachbeiträge: 38
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Habe den Listener nur einmal eingebaut... die HashCodes sind identisch Oo
ReatKay ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.07.2008, 13:10   #4 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.637
Abgegebene Danke: 0
Erhielt 2.565 Danke für 2.526 Beiträge
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
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.07.2008, 13:26   #5 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 24.04.2007
Fachbeiträge: 38
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
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]
ReatKay ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.07.2008, 13:41   #6 (permalink)
Java-Forum Team
Moderator
 
Registriert seit: 06.01.2007
Fachbeiträge: 16.732
Abgegebene Danke: 0
Erhielt 1.637 Danke für 1.482 Beiträge
Bei mir erscheint die Meldung bei jedem Klick nur einmal. Maus kaputt?
Marco13 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.07.2008, 13:43   #7 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.637
Abgegebene Danke: 0
Erhielt 2.565 Danke für 2.526 Beiträge
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?
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.07.2008, 13:51   #8 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 24.04.2007
Fachbeiträge: 38
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
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
ReatKay ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 04.08.2008, 07:45   #9 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 24.04.2007
Fachbeiträge: 38
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
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?
ReatKay ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 04.08.2008, 08:36   #10 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.637
Abgegebene Danke: 0
Erhielt 2.565 Danke für 2.526 Beiträge
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
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 04.08.2008, 09:42   #11 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 24.04.2007
Fachbeiträge: 38
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Das ist ja eben das Problem

Sie haben die selbe Systemzeit, und den selben Clickcount... das System führt effektiv 2 gleichzeitige Einzelklicks aus, die dann halt die Methode doppelt ausführen

Und das ganze geschieht so schnell, dass ich die Methode nicht mal mit einer Boolean sperren kann - die Boolean ist beim 2. durchlaufen immernoch true, obwohl sie direkt am Anfang des ersten Durchlaufs auf false gesetzt wird ^^
ReatKay ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 04.08.2008, 09:48   #12 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.637
Abgegebene Danke: 0
Erhielt 2.565 Danke für 2.526 Beiträge
das ist kein Problem, sondern ein charakteristisches Merkmal,
wenn das so schnell ist und ein normaler Doppelklick 50 ms Zeitabstand hat, dann kannst du die fehlerhafte Maus erkennen und die zweiten Ereignisse ignorieren

dass du Probleme mit der Nebenläufigkeit hast, kann ich mir nicht vorstellen,
dass wird doch alles vom AWT-Thread nacheinander abgearbeitet,
ansonsten hättest du mit dem HashCode/ Namen von Thread.currentTherad() ein weiteres Unterscheidungsmerkmal,

um Nebenläufigkeits-Fehler trotzdem zu vermeiden gibt es synchronized & Co, mache dich dazu schlau
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 05.08.2008, 07:53   #13 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 24.04.2007
Fachbeiträge: 38
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Danke Slater! Der Tip mit dem Synchronized hat's gebracht
ReatKay ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
SQLGrammarException in einfachem Beispiel boxi Data Tier 2 22.08.2008 10:14
Hilfe bei Programmierung von einfachem Mailprogramm + GUI Shanusch Java Basics - Anfänger-Themen 12 13.12.2007 17:26
Verwirrung bei einfachem Integral integralFuzzi Mathematik 4 26.07.2007 16:17
Problem mit einfachem TXT-Editor Gravity Java Basics - Anfänger-Themen 2 10.04.2005 22:33
Benötige Hilfe zu einfachem Programm premium_bavaricum Java Basics - Anfänger-Themen 4 29.03.2005 11:46


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de