问题底部的代码为我需要点击JMenu
的相当具体的情况提供了一个解决方案,它应该像JButton
一样,同时保留几乎所有的JMenu
格式化ActionMenu
。 JMenu
和AccessibleSelection
之间的格式差异应该在点击之后,它应该返回到正常状态(见图片)。
使用当前代码,它确实执行此操作。然而;如果要将鼠标移到不同的菜单上,或者将鼠标向下/向上移动菜单然后将鼠标悬停在菜单上,则菜单将进入选定状态(参见图像)。这不应该发生。
我的问题是为什么在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);
}
}
上时,会导致完全相同的问题。
?
答案 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();
}
}
),以便它看起来不像是另一个组件。