在鼠标更改JMenu后,AccessibleJMenu中的AccessibleSelection将返回

时间:2016-07-14 14:37:54

标签: java swing jmenu

问题底部的代码为我需要点击JMenu的相当具体的情况提供了一个解决方案,它应该像JButton一样,同时保留几乎所有的JMenu格式化ActionMenuJMenuAccessibleSelection之间的格式差异应该在点击之后,它应该返回到正常状态(见图片)。

enter image description here

使用当前代码,它确实执行此操作。然而;如果要将鼠标移到不同的菜单上,或者将鼠标向下/向上移动菜单然后将鼠标悬停在菜单上,则菜单将进入选定状态(参见图像)。这不应该发生。

enter image description here

我的问题是为什么在PopupMenu被清除且import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; public class Main extends JFrame { private static final long serialVersionUID = 3206847208968227199L; private Main() { setSize(600, 600); setJMenuBar(new MenuBar()); setVisible(true); setLocationRelativeTo(null); } public static void main(String[] args) { new Main(); } private class MenuBar extends JMenuBar { private static final long serialVersionUID = -2055260049565317972L; MenuBar() { add(new ActionMenu("Menu")); add(new JMenu("Another Menu")); } } private class ActionMenu extends JMenu { private static final long serialVersionUID = -6885806048559452542L; public ActionMenu(String name) { setText(name); menuItem(); } JButton butInvis; private void menuItem() { butInvis = new JButton(); butInvis.addActionListener(new MenuActionListener()); addMouseListener(new MenuMouseListener()); } private class MenuMouseListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { clcikComponent(butInvis); } private void clcikComponent(JButton comp) { comp.doClick(); } } private class MenuActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { AccessibleJMenu aJ = (AccessibleJMenu) getAccessibleContext(); aJ.clearAccessibleSelection(); getPopupMenu().setVisible(false); } } } } 被设置为不可见后发生这种情况?

setSelected(false)

编辑
我忘了提到我在JMenu上使用JMenu执行此操作(请参阅下面的代码);但是,当您将鼠标悬停在另一个private class MenuActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { setSelected(false); } } 上时,会导致完全相同的问题。

?

1 个答案:

答案 0 :(得分:0)

要解决此问题,您需要使用AccessibleContext的{​​{1}}而不是JMenuBar。这可以通过代码行

完成
JMenu

在此示例中,代码将放在getParent().getAccessibleContext().getAccessibleSelection().clearAccessibleSelection(); 中,它看起来像下面的代码。

MenuActionListener

Andrew Thompson所述,由于Principle of Least Astonishment,不应该这样做,除非您要更改组件的格式(本例中为private class MenuActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { getParent().getAccessibleContext().getAccessibleSelection().clearAccessibleSelection(); } } ),以便它看起来不像是另一个组件。