- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让我的 JMenuBar
模拟 Firefox 和 iTunes 的菜单栏的行为。行为:菜单栏最初是隐藏的。但是,当您按下 Alt
时,菜单栏会出现(第一个项目被选中),而当您没有选择任何菜单项时,菜单栏就会消失。我的想法是通过 SelectionModel
上的 ChangeListener
来监听 JMenuBar
的选择更改。
但是,附加的行为 SSCCE不尽如人意。当框架加载时,JMenuBar
不可见。当您按下 Alt
时,菜单栏会出现并选中第一个菜单(感谢 WindowsLookAndFeel
)。但是,随后每次按下 Alt
时都不会触发 ChangeEvents
。我不明白为什么...
有人有光要散发吗?
public class MenuBarTest extends javax.swing.JFrame {
public MenuBarTest() {
initComponents();
jMenuBar1.setVisible(false);
jMenuBar1.getSelectionModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
System.out.println(e.toString());
jMenuBar1.setVisible(jMenuBar1.isSelected());
System.out.println(jMenuBar1.isSelected());
System.out.println(jMenuBar1.getSelectionModel().isSelected());
}
});
}
private void initComponents() {
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
jMenuItem2 = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jMenu1.setText("File");
jMenuItem1.setText("jMenuItem1");
jMenu1.add(jMenuItem1);
jMenuBar1.add(jMenu1);
jMenu2.setText("Edit");
jMenuItem2.setText("jMenuItem2");
jMenu2.add(jMenuItem2);
jMenuBar1.add(jMenu2);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 279, Short.MAX_VALUE));
pack();
}
public static void main(String args[]) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewClass().setVisible(true);
}
});
}
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
}
最佳答案
看起来菜单栏一旦被选中就永远不会被取消选中。不确定这是否是错误。
直接监听 MenuSelectionManager 可能是一个更好的主意,因为您会在任何地方收到有关菜单选择的所有更改的通知。需要一些逻辑来过滤掉那些与 menuBar 无关的东西,类似于:
ChangeListener listener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
MenuElement[] elements = MenuSelectionManager.defaultManager().getSelectedPath();
jMenuBar1.setVisible(elements.length > 0 && elements[0] == jMenuBar1);
}
};
MenuSelectionManager.defaultManager().addChangeListener(listener);
更新
隐藏菜单栏的一个严重缺点是其菜单项的加速器停止工作。原因是只有正在显示的组件的 componentInputMaps 被要求处理它们。这是在 swing 包的内部深处完成的,即由包私有(private)类 KeyboardManager 完成的。无法挂接自定义管理器(可以实现它来处理未显示的菜单栏)。
不过,在链条的另一端,我们可以进行干预。基本上有两个选项,都是菜单栏的子类:
修改后的 ChangeListener:
bar.setHidden(true);
ChangeListener listener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
MenuElement[] elements = MenuSelectionManager.defaultManager().getSelectedPath();
bar.setHidden(!(elements.length >0 && elements[0] == bar));
}
};
MenuSelectionManager.defaultManager().addChangeListener(listener);
自定义菜单栏:
public static class JHideableMenuBar extends JMenuBar {
private boolean hidden;
public void setHidden(boolean hidden) {
if (this.hidden == hidden) return;
this.hidden = hidden;
revalidate();
}
@Override
public Dimension getPreferredSize() {
Dimension pref = super.getPreferredSize();
if (hidden) {
pref.height = 0;
}
return pref;
}
}
关于java - JMenuBar SelectionModel ChangeListener 只触发一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18093773/
我正在用Java编写一个基本的计时器程序,在该程序中我希望在顶部有一个菜单栏。我现在拥有的代码是: public Main() { JMenuBar menubar = new JMenuBa
我不确定为什么我的 JMenuBar 没有显示。我添加的其他 2 个面板显示得很好。我不确定它是否与 borderLayout 挑剔或什么有关。我确信(希望)这是一件小事。我正在学习如何创建 GUI,
我刚刚开始学习 Java,我一直在阅读 this文档。我不喜欢复制一堆代码然后粘贴。因此,我一直在尝试一次一件事情地完成文档。 我已经有了一个可用的 JFrame,并决定从添加一个菜单开始。 这是我的
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有以下 JMenuBar 代码。如何将我的按键监听器 CustomKeyListener 添加到整个 JMenuBar? package UI; import javax.swing.*; impo
我在 jMeun 栏上遇到问题,我的代码可以编译,但是当我尝试在显示中打开它时。出现空指针异常。我不知道为什么会这样。问题指出了我的代码中发生的 3 行。在“createMenuBar”方法中fram
开发一个 Java 应用程序,该应用程序打开一个窗口并允许用户在窗口上绘图,就像 Canvas 一样。 我刚刚添加了一个JMenuBar,最终将允许用户使用不同的绘图工具。问题是 JMenuBar 在
我创建了一个基于 Swing 的小型应用程序。为此,我使用 JMenuBar 类创建了一个菜单栏。但我想为该菜单栏应用光泽颜色。 特别是,我正在查看所看到的效果 here :第五个示例中的渐变颜色和第
我正在尝试将 JMenuBar 的子类添加到用户界面,但由于某种原因它从未显示。我尝试过使用 JFrame.setJMenubar() 和 JFrame.add(),我尝试过从 SwingUtilit
大家好,我已经被动地使用过这个页面很多次了,因为有很多很好的解释,但今天到目前为止,我不得不自己问一个问题,因为在我看来,发生的事情很奇怪。 我使用 Javax.Swing 中的 JFrame 编写了
我正在学习 Java 中的 GUI。我在这里有点困惑。当我像这样放置 window.setVisible(true); 时,如果调整 JMenuBar 的大小,我只会看到它(如果没有某种交互,它不会显
我有以下代码用于带有按钮的 GUI 和 JMenuBar 的代码。 MenuBarTest.java import javax.swing.*; import java.awt.*; import j
我试图让我的 JMenuBar 在 GUI 中显示,但它只是在顶部显示为一条 1 像素的线。 这是我的代码... public LibraryView() { setBounds(100,10
我有一个 GUI,我正在尝试向其中添加一个菜单栏,但每次我尝试添加 JmenuBar 时,它都说它需要一个 java.awt.menubar 并找到了一个它应该检测到的 java.swing.Jmen
我有一个包含 4 个项目的简单 JMenuBar 和一个包含一些文本字段微调器和组合框的面板。 现在,如果我在面板中使用 Spinner 或其他一些组件,Jmenu 项目似乎会在面板后面打开,我看不到
我用 Java 编写了一个简单的绘图程序,允许用户在不同的形状、大小和颜色之间进行选择(在 JMenuBar 中)并用鼠标绘制它们。在克服了程序的许多问题后(我最初是用 AWT 编写的,但后来被说服改
JMenuBar 没有开始显示 JMenuItem选择或显示 JMenu弹出窗口,直到它被第一次点击。单击 JMenuBar 中的某处后, 所有这些项目都会响应鼠标悬停。 我想绕过所需的初始点击,让它
我有以下设置 GUI 的函数。 public void go() { JFrame frame = new JFrame("Simplex RP Client V1.1 Beta");
我似乎做对了一切。我只需要实现一个简单的 JMenuBar 但它似乎不起作用。有人可以帮我解决这个问题吗? import java.awt.*; import java.awt.event.*; im
当我运行以下代码时,菜单栏会在光标移动到窗口的上部时显示。问题是,当我向上移动光标打开菜单但没有选择任何东西,然后将光标移出菜单栏区域时,它变得不可见但菜单的元素留在屏幕上。 我试图实现的是一个“自动
我是一名优秀的程序员,十分优秀!