# JButton + MouseDown



## MathiasBauer (2. Mai 2008)

Hallo,

ich möchte gerne solange der Button "unten" ist oder die Maustaste gedrückt ist (MouseDown), etwas ausgeführt wird.

Dazu habe ich folgenden Code zusammengestückelt.

Mir ist klar, dass es so nicht funktionieren kann, dass ist aber der Ansatz bei einigen anderen Forenbeiträgen. Vielleicht gibt es ja eine viel einfachere Lösung??? Vielen Dank im Voraus.


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


class ButtonTest extends JFrame
{
	private static boolean isPressed=false;
	
	public ButtonTest(){

	}
	public static void main(String args[]){
		ButtonTest frame = new ButtonTest();
		frame.setSize(400,400);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout(FlowLayout.CENTER));
		JButton button = new JButton("Test");
		button.addMouseListener(new MouseListener(){

			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mousePressed(MouseEvent e) {
				isPressed=true;
				while(isPressed){
					System.out.println("MouseDown");
				}
				
			}

			public void mouseReleased(MouseEvent e) {
				isPressed=false;
				System.out.println("MouseUp");
			}
			
		});
		panel.add(button);
		frame.getContentPane().add(panel);
		frame.setVisible(true);
	}
}
```


----------



## The_S (2. Mai 2008)

Deine while-schleife in einen extra Thread auslagern und ein Thread.sleep (für die CPU Auslastung) einbauen, dann gehts.


----------



## MathiasBauer (2. Mai 2008)

Danke! So geht's!

Also sehe ich es richtig, dass es keine einfachere Lösung gibt, z.B. eine Methode, die überprüft ob die Maustaste down oder up ist?

Hier mein Code:


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

class ButtonTest extends JFrame implements Runnable
{
	private static boolean isPressed=false;
	
	public ButtonTest(){

	}
	
	public void run(){
		while(isPressed){
			System.out.println("MouseDown");
		}		
	}
	
	
	public static void main(String args[]){
		ButtonTest frame = new ButtonTest();
		frame.setSize(400,400);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout(FlowLayout.CENTER));
		JButton button = new JButton("Test");
		button.addMouseListener(new MouseListener(){

			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mousePressed(MouseEvent e) {
				isPressed=true;
				new Thread(new ButtonTest()).start();
			}

			public void mouseReleased(MouseEvent e) {
				isPressed=false;
				System.out.println("MouseUp");
			}
			
		});
		panel.add(button);
		frame.getContentPane().add(panel);
		frame.setVisible(true);
	}
}
```


----------



## The_S (2. Mai 2008)

Was spricht gegen diese Methode? Ein Thread.sleep würde ich trotzdem noch einbauen (und wenns nur für 20 ms oder so ist).


----------



## Quaxli (2. Mai 2008)

So, wie es Hobbit (der schneller war) beschrieben hat, wird es üblicherweise gemacht.

Allerdings hast Du eine Änderung vergessen:


```
public void run(){
      while(isPressed){
         System.out.println("MouseDown");

             <<< Hier fehlt noch ein Thread.sleep(20);

      }      
   }
```


----------



## MathiasBauer (2. Mai 2008)

Alles klar. Danke!


----------

