2017-11-06 3 views
0

Ich habe einen MouseListener, den ich eine Funktion vorfabrizieren möchte, während die Maus gedrückt wird, bis es freigegeben wird. Gibt es trotzdem eine Mausfreigabe in einem MouseListener, anders als die Standardfunktion in der Schnittstelle, um dies zu tun (dies funktioniert nicht, weil es nicht aufgerufen werden kann, bis die Schleife beendet ist, aber für das Ende der Schleife erforderlich ist).MouseListener gepresste Schleife bis zur Freigabe

+0

Führen Sie die Schleife in einem anderen Thread - vergessen Sie nicht, obwohl, GUI-Frameworks sind nicht threadsicher und sind eingängig! – MadProgrammer

Antwort

0

Hier ist ein Beispiel, das/startet einen Thread erstellt, wenn die Maus gedrückt wird und stoppt den Faden, wenn die Maustaste losgelassen wird:

import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.*; 
public class MouseDemo { 

    private static SomeThread thread = new SomeThread(); 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame(""); 
     frame.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
       thread.interrupt(); 
       thread = null; 
       System.out.println("bye."); 
      } 
     }); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton button = new JButton("Click and Hold"); 

     button.addMouseListener(new MouseListener() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       button.setText("Release"); 
       thread = new SomeThread(); 
       thread.start(); 
      } 
      @Override 
      public void mouseReleased(MouseEvent e) { 
       button.setText("Click and Hold"); 
       thread.interrupt(); 
      } 
      @Override 
      public void mouseClicked(MouseEvent e) {} 
      @Override 
      public void mouseEntered(MouseEvent e) {} 
      @Override 
      public void mouseExited(MouseEvent e) {}    
     }); 

     frame.add(button); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class SomeThread extends Thread { 
    public void run() { 
     int iterations = 0; 
     while (true) { 
      iterations++; 
      System.out.println("The thread is running... " + iterations); 
      try { 
       Thread.sleep(25); 
      } catch (InterruptedException e) { 
       System.out.println("Thread stopped."); 
       return; 
      } 
     } 
    } 
}