JMenuBar JPopupMenu JMenu_获取子部件方法的区别

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kfepiza

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值