Announcement

Collapse
No announcement yet.

Methode erst ausführen wenn Maus mindestens 0,5 Sekunden im gleichen JButton verweil

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Methode erst ausführen wenn Maus mindestens 0,5 Sekunden im gleichen JButton verweil

    Hallo

    stehe gerede aufm Schlauch hab schon alles mögliche mit Timer und so durchprobiert, vielleicht kann mir ja jemand von Euch auf die Sprünge helfen:

    Ich habe mehrere Buttons die verschiedene Bildervorschauen anzeigen sollen.

    Ich brauch eine Funktion, die eine Methode erst aufruft nachdem diese mindestens 500ms auf einem Button verweilt hat, quasi wie die ToolTip-Funktion, bloß dass kein Tooltip angezeigt werden soll, sondern einfach eine Methode zum laden der Bilder aufgerufen wird.

    Damit soll verhindert werden, dass nicht jedes mal wenn man mit der Maus schnell über die Buttons fährt das Bild geladen wird.

    Das Event soll also komplett gelöscht werden, falls die Maus nicht mind. 500ms auf dem Button bleibt.

    Bisher habe ich das:

    Code:
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    import javax.swing.JButton;
    
    
    public class PreviewListener extends MouseAdapter{
    
      boolean workInProgress;
      JButton lastButton;
    
        private PreviewListener(){
    
        }
    
        public void mouseEntered(MouseEvent e) {
          JButton button = (JButton)e.getSource();
    
          wait(500);
    
          if(stillTheSameButton(button)){
            preloadImage();
          }
        }
    
        private boolean stillTheSameButton(JButton button){
          boolean result = false;
    
          if(lastButton == null){
            lastButton = button;
          }else if(button.equals(lastButton)){
            result = true;
          }
          return result;
        }
    
        private void preloadImage() {
          //load Images;
      }
    }
    schätze aber mein Ansatz ist falsch und irgendwie muss das anders laufen, bloß wie?

    Bitte um Anregung.

    Grüße Matthias

  • #2
    Starte doch bei MouseEntered einen Timer (bei MouseLeave beenden) der Dir nach 500ms das Bild an der aktuellen Mausposition oder wo auch immer anzeigt
    Evtl. kannst Du auch im Timer nachfragen ob sich der Mauszeiger noch über dem Button befindet, dann könnte man das MouseLeave weglassen.

    Comment


    • #3
      Ein wait ist kein Timer. Dieser hält den kompletten Programmablauf an.

      Besser die Klasse Timer (Swing Timer) nutzen.

      Im Mouseevent den Timer mit 500ms restarten und in dessen Actionmethode das Bild laden

      nicht vergessen, den Timer so zu konfiguriern, dass er nur einmal ausgeführt wird

      Im Leave wird der Timer abgebrochen
      Zuletzt editiert von Christian Marquardt; 23.09.2009, 09:19.
      Christian

      Comment


      • #4
        Danke für die Antworten werds gleich einmal probieren verwende jetzt die Timer-Klasse von Swing.

        Comment


        • #5
          das hier:

          Insel -> Timer


          sieht doch echt gut aus. Du definierst Dir einen TimerTask der Dir ein Bild an der derzeitigen Mouse Position anzeigt. Wenn Du über den Button drüber gehst startest Du den Timer mit dem TimerTask.

          Comment


          • #6
            Hallo,

            danke habs jetzt mit der beschriebenen Methode hinbekommen. Die Position wird von einem Panel von außerhalb gesetzt. (MouseListener- mouseMoved) und dann mit der letzten bekannten verglichen.

            Code:
            import java.awt.Point;
            import java.awt.Rectangle;
            import java.awt.event.ActionEvent;
            import java.awt.event.ActionListener;
            import java.awt.event.MouseAdapter;
            import java.awt.event.MouseEvent;
            
            import javax.swing.JButton;
            import javax.swing.Timer;
            
            
            public class PreviewListener extends MouseAdapter implements ActionListener{
              private Timer timer;
              private Rectangle previousButtonRectangle;
              private static Point currentPosition;
            
                private PreviewListener(){
                  timer = new Timer(500,this);
                }
            
                public void mouseEntered(MouseEvent e) {
            
                  if(previousButtonRectangle == null){
                    JButton button = (JButton) e.getSource();
                    Point position = button.getLocationOnScreen();
                    Rectangle dimension = button.getBounds();
                    Rectangle screenPosition = new Rectangle(position.x, position.y, dimension.width, dimension.height);
                    previousButtonRectangle = screenPosition;
                  }
                  timer.setRepeats(false);
                  timer.start();
                }
            
                private void preloadImage() {
                  //load Images;
              }
            
                public void actionPerformed(ActionEvent e) {
                  Point newPosition = currentPosition;
            
                  if(isStillInButtonRectangle(newPosition)){
                    preloadImage();
                  }
                  previousButtonRectangle = null;
                }
            
                private boolean isStillInButtonRectangle(Point point){
                  boolean returnValue = false;
            
                  if(previousButtonRectangle != null && previousButtonRectangle.contains(point)){
                    returnValue = true;
                  }
                  return returnValue;
                }
            
                public static void setCurrentPosition(Point currentPosition) {
                  PreviewListener.currentPosition = currentPosition;
                }
            }
            Grüße

            Matthias

            Comment

            Working...
            X