我有一个带菜单栏的简单应用程序。在菜单栏上有一个按钮(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);
}
}
我不能使用的ActionListener,JMenu的直线上升忽略它和MenuListener的行为不像我想要的(有多个项目,点击一个项目后将鼠标悬停在项目上)。将JOptionPane放在main()中,并将'jop.requestFocus()'放入'mouseReleased()'中不会执行任何操作。 – Zezombye
*“不像我想要的那样”*看起来这个GUI不会像用户想要的那样工作。图形用户界面的一个很好的通用规则是遵循“最小惊喜之路”。 –
@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