2017-02-24 1 views
0

Ich habe eine einfache App mit einer Menüleiste. In der Menüleiste befindet sich eine Schaltfläche (JMenu) zum Öffnen einer Datei.Java: Windows 7 Look-and-Feel (oder MouseListener?) Erfordert zweimal klicken auf JOptionPane

Durch Klicken auf diese Schaltfläche wird ein JOptionPane mit einem Eingabefeld und den Schaltflächen "OK" und "Abbrechen" geöffnet.

Sie müssen jedoch mindestens einmal auf den JOptionPane klicken, um (mit der Maus) mit einer beliebigen Komponente (den Schaltflächen oder dem Eingabefeld) zu interagieren. Wenn Sie den Pfad eingeben, müssen Sie zweimal auf die Schaltfläche "OK" klicken.

Ich denke, es ist ein Fokusproblem, aber Tastatureingabe funktioniert gut.

Was seltsam ist, ist, dass das Standard-UI-Look-and-Feel diesen Fehler nicht verursacht, aber mein JOptionPane funktionierte vorher gut (und ich hatte die System-UI Look-and-Feel, sowie der MouseListener) Ich weiß ehrlich gesagt überhaupt nicht, was diesen Fehler verursacht.

-Code ist hier:

import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JOptionPane; 
import javax.swing.UIManager; 

public class Classe1 { 

public static void main(String[] args) throws Exception { 

    JFrame jf = new JFrame(); 

    //Commenting this line makes it behave correctly 
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jf.setSize(new Dimension(400, 200)); 
    jf.setVisible(true); 
    jf.setLocationRelativeTo(null); 

    JMenuBar mb = new JMenuBar(); 
    JMenu test = new JMenu("Open file"); 
    test.addMouseListener(new MouseListener() { 
     @Override 
     public void mousePressed(MouseEvent arg0) { 

      JOptionPane jop = new JOptionPane(); 
      jop.requestFocus(); 

      //There is a warning, but if you do "JOptionPane.showInputDialog(...)" it doesn't do anything. 
      Object input = jop.showInputDialog(jf, "Enter path", "Title", JOptionPane.PLAIN_MESSAGE, null, null, ""); 

     } 
     @Override 
     public void mouseEntered(MouseEvent arg0) { 
     } 
     @Override 
     public void mouseExited(MouseEvent arg0) { 
     } 
     @Override 
     public void mouseClicked(MouseEvent arg0) { 
     } 
     @Override 
     public void mouseReleased(MouseEvent arg0) { 
     } 
    }); 
    mb.add(test); 
    jf.add(mb); 

} 
} 

Antwort

4

Die JMenu hat konzentrieren, bis die Maustaste losgelassen wird, aber der Dialog öffnet sich auf der Maus gedrückt wird.

Verwenden Sie entweder ActionListener (empfohlen) oder Ihre Logik in der Maus freigegeben.


In jedem Fall hat das Ergreifen von Maßnahmen bei gedrückter Maus normalerweise eine schlechte Nutzungserfahrung. Benutzer erwarten, dass nichts passieren sollte, wenn sie die Maus von der Schaltfläche wegbewegen, während die Maustaste gedrückt ist (eine Art "versehentlich gedrückt"). This post geht ausführlicher auf die UX von Mausereignissen ein.

+0

ich nicht Action verwenden können, JMenu gerade ignoriert bis es und ein MenuListener verhält sich nicht so, wie ich es möchte (mit mehreren Elementen, die sich auf einem Element befinden, nachdem Sie eines ausgewählt haben). Das Einfügen des JOptionPane in main() und das Setzen von 'jop.requestFocus()' in 'mouseReleased()' macht nichts. – Zezombye

+1

* "verhält sich nicht wie ich will" * Scheint, dass sich diese GUI nicht so verhält, wie der Benutzer es möchte. Eine gute allgemeine Regel für GUIs ist, dem Pfad der geringsten Überraschung zu folgen. –

+0

@Zezombye Sie sollten nichts auf Grund der Interaktion des Benutzers mit einem JMenu an erster Stelle tun. Fügen Sie Ihrem JMenu ein JMenuItem hinzu, und fügen Sie Ihrem JMenuItem Ihren ActionListener hinzu. Oder, noch besser, [setze eine Aktion] (http://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractButton.html#setAction-javax.swing.Action-) für das JMenuItem. – VGR

0

dies versuche ich denke, es funktioniert Für Double Click

public void mouseClicked(MouseEvent arg0) 
{ 
    if(arg0.getClickCount() == 2) 
    { 
     // your code to execute 
    } 
} 

Ebenso können Sie für Single Click versuchen

public void mouseClicked(MouseEvent arg0) 
    { 
     if(arg0.getClickCount() == 1) 
     { 
      // your code to execute 
     } 
    } 
Verwandte Themen