2017-02-24 16 views
0

我有一个带菜单栏的简单应用程序。在菜单栏上有一个按钮(JMenu)来打开一个文件。Java:Windows 7外观(或MouseListener?)需要在JOptionPane上点击两次

点击此按钮打开一个输入字段的JOptionPane,和按钮“确定”和“取消”。

但是,你需要在JOptionPane的点击至少一次交互(鼠标)与任何部件(按钮或输入栏)。这意味着如果您输入路径,则必须在“确定”按钮上单击两次。

我认为这是一个焦点问题,但键盘输入工作正常。

奇怪的是,默认的UI外观不会导致这个错误,但我的JOptionPane在之前(以及我有系统UI外观和MouseListener)都工作得很好,所以我真的不知道导致这个错误的原因。

代码是在这里:

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); 

} 
} 

回答

4

JMenu具有焦点,直到鼠标被释放,但在对话框中按下鼠标打开。

要么使用ActionListener(推荐),或做你的逻辑在鼠标释放。


无论如何,在按下鼠标时采取行动通常会有不好的使用体验。用户希望在鼠标按钮关闭的情况下将鼠标从按钮上移开(按“错误按下”),任何事情都不应该发生。 This post详细介绍了鼠标事件的用户体验。

+0

我不能使用的ActionListener,JMenu的直线上升忽略它和MenuListener的行为不像我想要的(有多个项目,点击一个项目后将鼠标悬停在项目上)。将JOptionPane放在main()中,并将'jop.requestFocus()'放入'mouseReleased()'中不会执行任何操作。 – Zezombye

+1

*“不像我想要的那样”*看起来这个GUI不会像用户想要的那样工作。图形用户界面的一个很好的通用规则是遵循“最小惊喜之路”。 –

+0

@Zezombye你不应该基于用户与JMenu的交互做任何事情。将JMenuItem添加到您的JMenu中,并将您的ActionListener添加到该JMenuItem中。或者,更好的是,在JMenuItem上设置[Action](http://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractButton.html#setAction-javax.swing.Action-)。 – VGR

0

试试这个我想它的工作原理 双点击

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

同样,你可以尝试单点击

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