Java 从JInternalFrame图标菜单中添加/删除项目

Java 从JInternalFrame图标菜单中添加/删除项目,java,swing,jinternalframe,Java,Swing,Jinternalframe,是否有办法在JInternalFrame图标菜单中添加/删除项目(这就是它的名称?) 多亏了@camickr,我才能够用它稍微挖掘一下UIManager。我发现的是:我打印出了NimbusLookAndFeelHashMap for(Entry<Object, Object> entry : SwingUtils.getUIDefaultsOfClass(JInternalFrame.class).entrySet()) { System.out.print

是否有办法在
JInternalFrame
图标菜单中添加/删除项目(这就是它的名称?)

多亏了@camickr,我才能够用它稍微挖掘一下UIManager。我发现的是:我打印出了
Nimbus
LookAndFeel
HashMap

    for(Entry<Object, Object> entry : SwingUtils.getUIDefaultsOfClass(JInternalFrame.class).entrySet()) {
        System.out.println(entry.getKey().toString() + " ----------- " + entry.getValue().toString());
        System.out.println("*********************************");
    }

不要认为你可以删除它们(不用创建自己的自定义UI,这对我来说太复杂了)

您应该能够禁用它们。查看
JInternalFrame
API构造函数,了解将属性设置为false的方法。或者可以使用setter方法分别禁用给定属性

编辑:

刚刚注意到Windows上的默认LAF没有该菜单,因此它肯定是LAF问题

编辑2:

也许作为一种黑客,您可以使用Darryl获得为内部框架定义的所有JMenuItem组件的列表。然后,您可以简单地从其父JMenu中删除菜单项

编辑3:

我建议获取JMenuItem组件的列表,而不是UIDefaults。这是假设基本内部框架使用JMenuBar、JMenu和JMenuItems。这个假设是正确的

事实证明,金属LAF扩展了基本LAF,并且没有将JMenubar添加到内部框架的标题窗格中。相反,只需在左上角绘制一个图标,解释为什么没有系统菜单

然而,Windows LAF实际上使用定制的绘图JLabel来显示系统菜单的图标,然后只响应鼠标按下事件来显示弹出菜单。因此,对于窗口LAF,您可以使用SwingUtils来查找此标签,只需从标签上移除鼠标侦听器。下面的“frame”变量是您的内部框架

java.util.List<JLabel> labels = SwingUtils.getDescendantsOfType(JLabel.class, frame, true);

for (JLabel label: labels)
{
    System.out.println(label.getClass().getName());

    MouseListener[] ml = (MouseListener[])label.getListeners(MouseListener.class);

    for (int i = 0; i < ml.length; i++)
        label.removeMouseListener( ml[i] );
}
java.util.List labels=SwingUtils.getDegenantSoftype(JLabel.class,frame,true);
用于(JLabel标签:标签)
{
System.out.println(label.getClass().getName());
MouseListener[]ml=(MouseListener[])label.getListeners(MouseListener.class);
对于(int i=0;i

正如我之前所建议的,这实际上只是一个黑客行为,可能不应该使用,因为它不是一个跨平台的解决方案。

1“对我来说太复杂”是您的一个震惊。2) Windows LAF忽略了图标,但菜单仍在我的屏幕上。我应该说是跨平台LAF(即金属LAF),如果不指定LAF,这是默认设置。Windows LAF和你描述的一样。哦,我明白了。是,
Metal
忽略了菜单。有意思。我为什么要删除鼠标侦听器?我对改变菜单的内容感兴趣……出于某种原因,我错过了“添加”并认为您只想删除项目(如果您注意到我最初的答案),所以我沿着这条路径继续。因此,如果要修改菜单,则需要修改LAF。您可以从查看
WindowsInternalFrameTitlePane
开始。它包含一个受保护的方法
addSystemMenuItems(…)
,用于设置弹出菜单。
java.util.List<JLabel> labels = SwingUtils.getDescendantsOfType(JLabel.class, frame, true);

for (JLabel label: labels)
{
    System.out.println(label.getClass().getName());

    MouseListener[] ml = (MouseListener[])label.getListeners(MouseListener.class);

    for (int i = 0; i < ml.length; i++)
        label.removeMouseListener( ml[i] );
}