Doppelklicks von Singleklicks unterscheiden

Status
Nicht offen für weitere Antworten.

BRT006

Aktives Mitglied
Hallo zusammen!

Folgendes Problem stellt sich mir dar.

Ich habe ein JTable und beim Single-Klick auf den Header soll die Tabelle sortiert werden nach dieser Spalte. Beim Doppelklicken auf Headergrenze (analog Excel) soll die Spaltenbreite auf Best-Fit angepaßt werden. Das Problem selbst ist, dass ich mich für mouseClicked registriert habe und mit theMouseEvent.getClickCount() diesen Wert überprüfe.

Jedem Doppelklick geht logischerweise immer ein Single-Klick voraus, in meinem Fall heißt das aber das die Tabelle erst sortiert und dann "resized" wird, was nicht gewünscht ist.

Zusammenfassend:
Single-Klick: Sortieren
Doppel-Klick: Resize

Gibts dafür nen Lösungsansatz?

THX schon mal!
 
R

Roar

Gast
BRT006 hat gesagt.:
Jedem Doppelklick geht logischerweise immer ein Single-Klick voraus

nö.

bei folgendem:

Code:
public void mouseClicked(MouseEvent e) {
if(e.getClickCount() == 1) {
// einzerlklick
} else {
// doppelklick
}
}

sollte bei einem doppelklick nur der code im else block ausgeführt werden, nicht davor noch der einzelklickcode
 

AlArenal

Top Contributor
BRT006 hat gesagt.:
Jedem Doppelklick geht logischerweise immer ein Single-Klick voraus

Möchte man meinen, dem ist aber nicht so. Die Maus läuft über den Maustreiber, aus Sicht vonJava also übers OS. Je nachdem wie der Treiber konfiguriert ist, meldet er zwei aufeinanderfolgende Klicks als einen Doppelklick an das Betriebssystem und so landet es auch in der JVM und damit in deiner Anwendung.

Du kannst ja einige Treiber auch so konfigurieren, dass z.B. ein einzelner Klick mit der mittleren Taste als Doopelklick mit der linken Taste interpretiert wird. Wäre ja schön doof, wenn das in Java nicht auch als Doppelklick ankäme. Du fragst ja nicht wirklich die Maus ab, sondern lediglich das, was das Betriebssystem über den Treiber an Events rausschaufelt und da sind der Fantasie ja keine Grenzen gesetzt.
 

BRT006

Aktives Mitglied
Code:
package table;

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

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;


public class KlickDemo extends JFrame
{
  private JLabel myLabel = new JLabel("Klick mich!");
  public KlickDemo()
  {
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    getContentPane().add(myLabel);
    myLabel.addMouseListener(new MouseAdapter(){
      public void mouseClicked(MouseEvent evt)
      {
        if(evt.getClickCount()==1)
        {
          System.out.println("1 Klick");
        }
        else
        {
          System.out.println("Doppelklick");
        }
      }
    });
    
    pack();
    setVisible(true);
  }
  

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


Tut es aber nicht, probier bitte selbst obigen Code. So meintest du es denke ich. Folgender Output bei nem Doppelklick:

1 Klick
Doppelklick
 

BRT006

Aktives Mitglied
@AlArenal: Wie erklärst du dir dann o.g. Phänomen? Oder tritt das bei dir nicht auf? Und was mich unendlich mehr interessiert. Wie fixe ich das? Ich fasse es nicht dass ich mich ewig bei nem Doppelklick aufhalte was doch eigentlich total easy sein müsste.
 

AlArenal

Top Contributor
Das ist seltsam. Ich arbeite hier recht viel mit einer Graph-Lib und da gibts dann das, was ich Arschabwischerfunktion nenne, sprich in einem View werden die Methoden doClick() und doDblClick() aufgerufen, wenn entsprechend was mit der Maus passiert. Interessanterweise erfolgt vor einem Aufruf von doDblClick() kein Aufruf von doClick() und ich habe eben in den Sourcen nachgeschaut: Da gibts keinen Workaround, da wird direkt mittels MouseEvent gearbeitet.

Daher war ich mir bei meiner Aussage ziemlich sicher.. Für mich funktioniert das Standardverhaltern. Andernfalls kann man es mit folgendem Kommentar halten:

"This is indeed bogus. There should be two messages, one for the first click
and one for the second. This is because the usual paradigm is that a single
click represents a 'selection' and the double click an 'activation'. If you
have implemented different behavior for a component than that, you have a
pretty ridiculous design on your hands."

;) ;)
 

thE_29

Top Contributor
Den Fehler hatte ich auch immer, habs aber mit einem Workaround gelöst, was bisi kompliziert ist!

Probiers so wie AlAreanal gesagt hat, bzw den englischen Text!

Ansonsten kannst du nen Timer nehmen und nach einer gewissen Zeit entweder 1klick oder 2klick sagen :)


@Roar und AlArenal: ha :bae: falsch ;)
 

BRT006

Aktives Mitglied
Naja, ich habs jetzt so gelöst:

Code:
package table;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.WindowConstants;


public class KlickDemo extends JFrame
{
  private JLabel myLabel = new JLabel("Klick mich!");
  public KlickDemo()
  {
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    getContentPane().add(myLabel);
    myLabel.addMouseListener(new MouseAdapter() 
        {
      		final Timer timer = new Timer(200,new ActionListener()
      		    { 
      		  		public void actionPerformed(ActionEvent e) 
      		  		{
      		  		  System.out.println("single"); timer.stop(); } 
      		  		});
      		public void mouseClicked (MouseEvent e)
      		{
      		  if (timer.isRunning()) 
      		  { 
      		    timer.stop(); 
      		    System.out.println("double"); 
      		  }
      		  else 
      		  { 
      		    timer.restart(); 
      		  }
      		}
        });
    
    pack();
    setVisible(true);
  }
  

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

Ob ich den Code allerdings meinem Boss verkaufen kann, muss ich noch abwarten :wink:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben