繁体   English   中英

Java:Windows 7外观(或MouseListener?)要求在JOptionPane上单击两次

[英]Java: Windows 7 look-and-feel (or MouseListener?) requires clicking twice on JOptionPane

我有一个带有菜单栏的简单应用程序。 菜单栏上的按钮(JMenu)打开文件。

单击此按钮将打开一个具有输入字段的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);

}
}

JMenu一直具有焦点,直到释放鼠标为止,但是在按下鼠标时对话框会打开。

使用ActionListener (推荐),或者在释放鼠标时进行逻辑处理。


无论如何,对鼠标按下的操作通常会有不良的使用体验。 用户期望如果在按下鼠标按钮时将鼠标从按钮上移开(什么是“误按”),则什么也不会发生。 这篇文章将详细介绍鼠标事件的用户体验。

试试这个,我想它适用于双击

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
       }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM