JMenuBar JPopupMenu JMenu 获取子部件方法的区别
JMenuBar JPopupMenu JMenu 获取子Menu的方法名并不相同, 感觉不是一个程序员写的
-
JMenuBar JPopupMenu JMenu 获取Menu子部件数量的方法
-
-
JMenuBar用getMenuCount()或getComponentCount()都可以, 效果相同
- getMenuCount()就是调用getComponentCount() , 源码如下↓
-
@BeanProperty(bound = false) public int getMenuCount() { return getComponentCount(); }
JPopupMenu用getComponentCount(),没有其他方法
- JPopupMenu的getComponentCount()方法继承自Container,没有重写 JMenu用getItemCount()或getMenuComponentCount()方法, 效果相同
- JMenu的getItemCount()就是调用getMenuComponentCount() , 源码如下↓
-
@BeanProperty(bound = false) public int getItemCount() { return getMenuComponentCount(); }
-
JMenuBar JPopupMenu JMenu 获取Menu子部件对象的方法
-
-
JMenuBar通过getMenu(index)或getComponent(index), 推荐getMenu(index),已强转返回JMenu
- getMenu(index)就是调用getComponent(index)后强转为JMenu后返回
- getMenu调用getComponentAtIndex调用getComponent得到component,返回(JMenu)component, 源码如下↓
-
public JMenu getMenu(int index) { Component c = getComponentAtIndex(index); if (c instanceof JMenu) return (JMenu) c; return null; } @Deprecated public Component getComponentAtIndex(int i) { if(i < 0 || i >= getComponentCount()) { return null; } return getComponent(i); }
JPopupMenu通过getComponentCount()获取子部件
- JPopupMenu没有新增专属的获取子Menu的方法, 用Container现成的, 还要强转, 不方便 JMenu通过 getItem(index) 或 getMenuComponent(index) 获取子Menu, 不能用getComponent()
- 推荐用getItem(index)返回JMenuItem , getMenuComponent(index)返回Component
- getItem就是调用getMenuComponent获得component并强转为JMenuItem再返回, 源码如下↓
-
public JMenuItem getItem(int pos) { if (pos < 0) { throw new IllegalArgumentException("index less than zero."); } Component c = getMenuComponent(pos); if (c instanceof JMenuItem) { JMenuItem mi = (JMenuItem) c; return mi; } return null; }
测试代码1
package menu;
import java.awt.event.*;
import javax.swing.*;
public class JMenuBar_JPopupMenu_JMenu_获取子部件方法的区别 {
static void pln() {System.out.println();}
static void pln(Object o) {System.out.println(o);}
static void pln(Object o1, Object o2) {pln(o1+" 的结果是 "+o2);}
static JFrame frame = new JFrame(new SecurityManager() {String n(){return getClassContext()[1].getSimpleName();}}.n());
static JTextPane jTextPane = new JTextPane();
static JScrollPane jScrollPane = new JScrollPane(jTextPane);
static JMenuBar jMenuBar = new JMenuBar();
static JPopupMenu jPopupMenu = new JPopupMenu();
static JMenuItem jMenuItem;
static JMenu jMenu;
static {
frame.addWindowListener(new WindowAdapter() {@Override public void windowClosing(WindowEvent e) {frame.dispose();System.exit(0);}});
frame.setBounds(100,50,1400,1000); frame.add(jScrollPane); jTextPane.setContentType("text/html");
frame.setJMenuBar(jMenuBar); // JMenuBar装在JFrame上
jTextPane.setComponentPopupMenu(jPopupMenu); //JPopupMenu装在JComponent上
for(int x=0; x<10; x++) {
jMenu = new JMenu("JMenuBar的JMenu-"+x); jMenuBar.add(jMenu);
for(int y=0; y<10; y++) {jMenuItem = new JMenuItem(jMenu.getText()+"的JMenuItem-"+y); jMenu.add(jMenuItem);}
jMenu = new JMenu("JPopupMenu的JMenu-"+x); jPopupMenu.add(jMenu);
for(int y=0; y<10; y++) {jMenuItem = new JMenuItem(jMenu.getText()+"的JMenuItem-"+y); jMenu.add(jMenuItem);}
}
pln("jMenuBar.getComponentCount()", jMenuBar.getComponentCount());
pln("jMenuBar.getMenuCount()", jMenuBar.getMenuCount());
pln("jPopupMenu.getComponentCount()", jPopupMenu.getComponentCount());
pln("jMenu.getComponentCount()", jMenu.getComponentCount());
pln("jMenu.getItemCount()", jMenu.getItemCount()); // JMenu的getItemCount()就是调用getMenuComponentCount()
pln("jMenu.getMenuComponentCount()", jMenu.getMenuComponentCount());
pln("jMenuBar.getComponent(0)==jMenuBar.getMenu(0)", jMenuBar.getComponent(0)==jMenuBar.getMenu(0));
for(int x=0; x<jMenuBar.getMenuCount(); x++) {
jMenu = jMenuBar.getMenu(x);
for(int y=0; y<jMenu.getMenuComponentCount(); y++) {
jMenu.getItem(y).addActionListener(ev->{ // getItem(i)调用了getMenuComponent(i)并强制转换为MenuItem
JOptionPane.showMessageDialog(frame, ((JMenuItem)ev.getSource()).getText());
});
}
}
for(int x=0; x<jPopupMenu.getComponentCount(); x++) {
jMenu = (JMenu) jPopupMenu.getComponent(x);
for(int y=0; y<jMenu.getItemCount(); y++) {
jMenuItem = (JMenuItem) jMenu.getMenuComponent(y);
jMenuItem.addActionListener(ev->{
JOptionPane.showMessageDialog(frame, ((JMenuItem)ev.getSource()).getText());
});
}
}
jTextPane.setText("""
<html><head><style>
dt{font-size:18px;}
dd dt{font-size:14px; color:blue;}
</style></head><body>
<dl>
<dt>JMenuBar JPopupMenu JMenu 获取Menu子部件数量的方法</dt>
<dd>
<dl>
<dt>JMenuBar用getMenuCount()或getComponentCount()都可以, 效果相同 </dt>
<dd>getMenuCount()就是调用getComponentCount() , 源码如下↓</dd>
<dd><pre><code>
@BeanProperty(bound = false)
public int getMenuCount() { return getComponentCount(); }
</code></pre></dd>
<dt>JPopupMenu用getComponentCount(),没有其他方法 </dt>
<dd>JPopupMenu的getComponentCount()方法继承自Container,没有重写</dd>
<dt>JMenu用getItemCount()或getMenuComponentCount()方法, 效果相同
<dd>JMenu的getItemCount()就是调用getMenuComponentCount() , 源码如下↓
<dd><pre><code>
@BeanProperty(bound = false)
public int getItemCount() { return getMenuComponentCount(); }
</code></pre></dd>
</dl>
</dd>
</dl>
<dl>
<dt>JMenuBar JPopupMenu JMenu 获取Menu子部件对象的方法</dt>
<dd>
<dl>
<dt>JMenuBar通过getMenu(index)或getComponent(index), 推荐getMenu(index),已强转返回JMenu</dt>
<dd>getMenu(index)就是调用getComponent(index)后强转为JMenu后返回</dd>
<dd>getMenu调用getComponentAtIndex调用getComponent得到component,返回(JMenu)component, 源码如下↓
<dd><pre><code>
public JMenu getMenu(int index) {
Component c = getComponentAtIndex(index);
if (c instanceof JMenu) return (JMenu) c; return null;
}
@Deprecated
public Component getComponentAtIndex(int i) {
if(i < 0 || i >= getComponentCount()) { return null; } return getComponent(i);
}
</code></pre></dd>
<dt>JPopupMenu通过getComponentCount()获取子部件</dt>
<dd>JPopupMenu没有新增专属的获取子Menu的方法, 用Container现成的, 还要强转, 不方便 </dd>
<dt>JMenu通过 getItem(index) 或 getMenuComponent(index) 获取子Menu, 不能用getComponent()</dt>
<dd>推荐用getItem(index)返回JMenuItem , getMenuComponent(index)返回Component</dd>
<dd>getItem就是调用getMenuComponent获得component并强转为JMenuItem再返回, 源码如下↓</dd>
<dd><pre><code>
public JMenuItem getItem(int pos) {
if (pos < 0) { throw new IllegalArgumentException("index less than zero."); }
Component c = getMenuComponent(pos);
if (c instanceof JMenuItem) { JMenuItem mi = (JMenuItem) c; return mi; }
return null;
}
</code></pre></dd>
</dl>
</dd>
</dl>
</body></html>
""");
frame.setVisible(true);
}
public static void main(String...arguments) {}
}
控制台输出↓
jMenuBar.getComponentCount() 的结果是 10
jMenuBar.getMenuCount() 的结果是 10
jPopupMenu.getComponentCount() 的结果是 10
jMenu.getComponentCount() 的结果是 0
jMenu.getItemCount() 的结果是 10
jMenu.getMenuComponentCount() 的结果是 10
jMenuBar.getComponent(0)==jMenuBar.getMenu(0) 的结果是 true