JTogelButton鼠标进入和离开时触发了ChangeListeter?

jinggangshi 2021-03-03 08:18:38
创建代码:

private void addToggleButton(JToolBar jtoolbar, Element tool) {
JToggleButton togBtn = new JToggleButton();
togBtn.setName(tool.attributeValue(Widgets.key_tool_attr_name));
togBtn.setText(tool.attributeValue(Widgets.key_tool_attr_text));
togBtn.setActionCommand(tool.attributeValue(Widgets.key_tool_attr_cmd));
// togBtn.setIcon(new ImageIcon(tool.attributeValue(Widgets.key_tool_attr_icon)));
int w = Integer.parseInt(tool.attributeValue(Widgets.key_tool_attr_width));
int h = Integer.parseInt(tool.attributeValue(Widgets.key_tool_attr_height));
Dimension size = new Dimension(w, h);
togBtn.setSize(size);
togBtn.setPreferredSize(size);
togBtn.setBackground(RdrmColor.parseToColor(tool.attributeValue(Widgets.key_tool_attr_bcolor)));
togBtn.setForeground(RdrmColor.parseToColor(tool.attributeValue(Widgets.key_tool_attr_fcolor)));
boolean enabled = !"false".equals(tool.attributeValue(Widgets.key_tool_attr_enabled)) ? true : false;
togBtn.setEnabled(enabled);
togBtn.setBorder(null);
// JToggleButton用哪种监听器
togBtn.addChangeListener(changelistener);
jtoolbar.add(togBtn);
}



监听器代码:

public void createActionListener() {
applistener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
requestExecute(e);
}
};

changelistener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JToggleButton toggleBtn = (JToggleButton) e.getSource();
System.out.println(toggleBtn.getText() + " 是否选中: " + toggleBtn.isSelected());
// setMute(jtb.isSelected());
// System.out.println(isMute);
}
};
itemListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
// 当JRadioButton被选中时,改变变量engine_selected的值
JRadioButton rBtn = (JRadioButton) e.getSource();
engine_selected = rBtn.getName().trim();
switch (engine_selected) {
case engine_selected_checktext:
System.out.println(((JRadioButton)e.getSource()).getActionCommand());
break;
case engine_selected_offline:
System.out.println(((JRadioButton)e.getSource()).getActionCommand());
break;
case engine_selected_online:
System.out.println(((JRadioButton)e.getSource()).getActionCommand());
break;
case engine_selected_websocket:
System.out.println(((JRadioButton)e.getSource()).getActionCommand());
break;
}
}
}
};
}



执行情况,在鼠标经过、点击、离开时触发了7次:


我只想在鼠标状态完成时触发一次,怎么办?
...全文
90 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinggangshi 2021-03-03
  • 打赏
  • 举报
回复
引用 1 楼 sunyiz 的回复:
其实,要在 JTogelButton 选中/取消选中时触发某个事件, 大部分情况下用 ActionListener 就足够了,无论是鼠标点击还是按空格改变了按钮状态,都会触发 只有极少数情况,比如你还有别的地方会通过代码直接调用 setSelected(true/false) 改变按钮状态, 那种情况下才在按钮状态发生变化时,不会触发ActionListener 如果有这样的需求的话,可以用 ItemListener 而不是 ChangeListeter ChangeListeter 确实不是一个很友好的事件监听器,很少会去用它

		btn.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent e) {
				int stateChange = e.getStateChange();
				if (stateChange == ItemEvent.SELECTED) {//选中时
					System.out.println(true);
				} else if (stateChange == ItemEvent.DESELECTED) {//取消选中时
					System.out.println(false);
				}
			}
		});
我也感觉这个是监听器的问题,查了下源码,只有一个方法,通过ChangeEvent e能判断的事情很少了
sunyiz 2021-03-03
  • 打赏
  • 举报
回复
其实,要在 JTogelButton 选中/取消选中时触发某个事件, 大部分情况下用 ActionListener 就足够了,无论是鼠标点击还是按空格改变了按钮状态,都会触发 只有极少数情况,比如你还有别的地方会通过代码直接调用 setSelected(true/false) 改变按钮状态, 那种情况下才在按钮状态发生变化时,不会触发ActionListener 如果有这样的需求的话,可以用 ItemListener 而不是 ChangeListeter ChangeListeter 确实不是一个很友好的事件监听器,很少会去用它

		btn.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent e) {
				int stateChange = e.getStateChange();
				if (stateChange == ItemEvent.SELECTED) {//选中时
					System.out.println(true);
				} else if (stateChange == ItemEvent.DESELECTED) {//取消选中时
					System.out.println(false);
				}
			}
		});

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧