# Unterscheidung Mausklicks



## Dan1el (28. Jun 2010)

Guten Abend,

für unseren Abiball muss ich ein Programm schreiben mit dem wir ein Fussballquiz machen wollen.
Es treten Lehrer gegen Schüler an und da sollen die Lehrer natürlich immer die schweren Fragen bekommen 

Nun möchte ich, dass wenn ich Rechtsklick auf einen Button mache, die leichte Frage für die Schüler kommt und wenn ich Linksklick auf einen Button mache, soll natürlich die schwere Frage für die Lehrer erscheinen.

*Leider hab ich keine Ahnung wie ich zwischen Rechts- und Linksklick unterscheiden kann *
Alles andere werde ich selbst hinbekommen.

Hoffe ihr könnt mir da auf die Schnelle weiterhelfen.
Im Moment steht nur das grafische Gerüst.

Das Programm sieht man natürlich live über den Beamer.


----------



## Illuvatar (28. Jun 2010)

Entweder "von Hand": MouseEvent (Java Platform SE 6)
Oder besser mit dieser Hilfsmethode: SwingUtilities (Java Platform SE 6)


----------



## Dan1el (28. Jun 2010)

Ja auf die Hilfsmethoden bin ich auch schon gestoßen, allerdings kann ich damit wenig anfangen da mir das Wissen fehlt.

Wie müssten denn mein Eventhandling aussehen, wenn ich:

10 Buttons habe = 20 Fragen (10 Schülerfragen + 10 Lehrerfragen)


Wenn ich also auf einen Button klicke muss geschaut werden welcher Button geklickt und mit welcher Maustaste er betätigt wurde. Kannst du mir da weiterhelfen.


----------



## Illuvatar (28. Jun 2010)

Wenn du mit Buttons wirkliche Buttons (d.h. javax.swing.JButton oder veraltet: java.awt.Button) meinst, dann gibt es da das Problem dass solche Buttons ja eigentlich nur auf Linksklicks reagieren.
Bei einem Rechtsklick gibt es deshalb soweit ich weiß kein ActionEvent: statt dem ActionListener solltest du also einen MouseListener verwenden. Diese Methode ist dann die, die für dich relevant sein sollte. Und da kriegst du dann auch das MouseEvent mit den Methoden die ich oben geschrieben hab.

Das war jetzt noch mehr so ein Anstoß - falls dir das noch nicht genug hilft, einfach weiterfragen


----------



## Dan1el (28. Jun 2010)

Illuvatar hat gesagt.:


> Wenn du mit Buttons wirkliche Buttons (d.h. javax.swing.JButton oder veraltet: java.awt.Button) meinst, dann gibt es da das Problem dass solche Buttons ja eigentlich nur auf Linksklicks reagieren.



Oh, das ist jetzt aber ein Problem...

Die "Maus-Methode" müsste dann so aussehen?

```
public class MyMouseListener implements MouseListener
	{
		public void void mouseClicked(MouseEvent e)
		{	
		if(e.getSource()==**********)
	         
		}
	}
```
********** --> Der Maus "Knopf"?? (Links oder Rechts?)


Wie kann ich denn dann mein Problem lösen? Die Rechts-Links-Unterscheidung dient ja eigentlich nur dazu, dass ich meinen Mitschülern die leichten Fragen zusteuern kann. Von außen soll hat alles so aussehen als ginge es mit rechten Dingen zu 
Weisst du da was?


----------



## mlauX (28. Jun 2010)

Guck mal hier:


```
public void mouseClicked(MouseEvent e) {
  if (e.getModifiers() == 4) {
    // niergend eine methode
    button_mouseClicked1(e, x, y);
  }
}
```

Wenn der e.getModifiers() 4 ist, wurde die rechte maus gedrückt, bei 16 die linke maus.


----------



## Dan1el (28. Jun 2010)

Ahh gut.

Also kann ich das dann so machen, dass ich erst überprüfen lasse, welcher Button angeklickt wurde und als zweiter Schritt wird geschaut mit welcher Maustaste und dann kann die entsprechende Frage ausgegeben werden.


----------



## mlauX (28. Jun 2010)

Genau so sollte es funktionieren. Kannst ja mal wenn du nicht klar kommst dein Code posten..


----------



## Illuvatar (28. Jun 2010)

Das mit dem getModifiers sieht aber irgendwie unschön aus... irgendwelche Konstanten im Code die vom Himmel fallen sind nie gut. Was spricht gegen getButton oder SwingUtilities?

Ich hab grad einfach mal ein kleines Beispiel geschrieben, wie man das Problem vielleicht lösen könnte:

```
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class Example extends JFrame {
    private JLabel questionText;

    public Example() {
        super("Fußball-Quiz!");

        setLayout(new BorderLayout());
        questionText = new JLabel("", SwingConstants.CENTER);
        add(questionText, BorderLayout.CENTER);
        JButton newQuestionButton = new JButton("Neue Frage!");
        add(newQuestionButton, BorderLayout.SOUTH);

        newQuestionButton.addMouseListener(new MyListener(this));

        setSize(500, 250);
        setLocationByPlatform(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void newQuestion(boolean easy) {
        if (easy) {
            questionText.setText("Wer wird im Jahr 2010 Weltmeister?");
        } else {
            questionText.setText("Wer wird im Jahr 2*3*5*67 Weltmeister?");
        }
    }

    public static void main(String[] args) {
        new Example();
    }
}

class MyListener extends MouseAdapter {
    private Example example;

    public MyListener(Example e) {
        example = e;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (SwingUtilities.isLeftMouseButton(e)) {
            example.newQuestion(false);
        } else if (SwingUtilities.isRightMouseButton(e)) {
            example.newQuestion(true);
            JButton source = (JButton) e.getSource();
            source.doClick();
        }
    }
}
```
Der wichtige Teil ist die letzte Methode ganz unten


----------



## mlauX (28. Jun 2010)

Ich gebe zu, deine Variante ist definitv die Schönere 

Damit wärs mit dem Rechtsklick ja geklärt.

Gute Nacht


----------



## Dan1el (28. Jun 2010)

@Illuvatar

genau so hab ich mir das vorgestellt! 

Ich hab mein Programm jetzt auch erweitert, jedoch ist deine Idee nicht eingebunden, bei mir ist jetzt gerade das Problem, dass die Erkennung ob links oder rechtsklick nur über dem JLabel funktioniert, nicht jedoch über den Buttons.

Hier mein Code: ist ziemlich primitiv, aber 2 Jahre Java in der Schule und nur mit awt geben nicht mehr her 

```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class FussballQuiz extends JFrame 

{
  Container c;          
  JLabel beschriftung, textfeld;  
  JButton frage0, frage1, frage2, frage3, frage4, frage5, frage6, frage7, frage8, frage9;
  Color f;
  JPanel panel1,panel2,panel3;

  public FussballQuiz() 
  
  {
    c = getContentPane();
    c.setLayout(new GridLayout(3,0));
	
	JPanel panel1 = new JPanel();
	JPanel panel2 = new JPanel();
	JPanel panel3 = new JPanel();

	panel1.setLayout(new FlowLayout());
	panel2.setLayout(new GridLayout(0,5));
	panel3.setLayout(new GridLayout(0,5));
	
	textfeld = new JLabel("Hier steht die Frage ;) ");
	panel1.add(textfeld);
	
	panel2.add(frage0 = new JButton("Frage 1"));
	panel2.add(frage1 = new JButton("Frage 2"));
	panel2.add(frage2 = new JButton("Frage 3"));
	panel2.add(frage3 = new JButton("Frage 4"));
	panel2.add(frage4 = new JButton("Frage 5"));
	panel3.add(frage5 = new JButton("Frage 6"));
	panel3.add(frage6 = new JButton("Frage 7"));
	panel3.add(frage7 = new JButton("Frage 8"));
	panel3.add(frage8 = new JButton("Frage 9"));
	panel3.add(frage9 = new JButton("Frage 10"));
	
	frage0.addActionListener(new MyActionListener());
	
	c.add(panel1);
	c.add(panel2);
	c.add(panel3);
	c.addMouseListener(new MyMouseListener());
  }
  
  public static void main(String[] args) 
  {
      FussballQuiz fenster = new FussballQuiz();
      fenster.setTitle("Fussball-Quiz");
      fenster.setSize(800,400);
      fenster.setLocation(100,100);
      fenster.setResizable(false);
      fenster.setVisible(true);
      fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
  
  class MyActionListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{	
			System.out.println("Gedrückt!");
		}	
	}

public class MyMouseListener extends MouseAdapter
    {
        public void mouseClicked(MouseEvent e) 
		{
		if (e.getModifiers() == 4) 
			{
   			System.out.println("Rechte Maustaste");
  			}
  		if (e.getModifiers() == 16) 
			{
   			System.out.println("Linke Maustaste");
  			}	
		}
    }   
}
```

Darf ich deinen Code übernehmen?


----------



## Dan1el (29. Jun 2010)

Habs jetzt hinbekommen 

Vielen Dank für eure Hilfe.


----------

