Java 有没有一种方法可以在鼠标侦听器的开关盒中使用actionCommand?
我正在Java swing应用程序中的导航面板上工作 在左侧,我有一个导航菜单:Java 有没有一种方法可以在鼠标侦听器的开关盒中使用actionCommand?,java,swing,switch-statement,mouselistener,Java,Swing,Switch Statement,Mouselistener,我正在Java swing应用程序中的导航面板上工作 在左侧,我有一个导航菜单: 订单状态 检查报告 文件 返回主菜单 重新配置导航中的元素JButtons,如果鼠标悬停在这些元素上以模拟超链接导航,则这些元素看起来像标签,并带有下划线 这很好,但是我在按钮上使用了鼠标侦听器(不是操作侦听器,因为我希望能够注册鼠标悬停在按钮上,鼠标光标离开按钮等)和if语句来检查单击了哪个按钮/标签 if (e.getSource() == btn_orderStatus) { /
- 订单状态
- 检查报告
- 文件
- 返回主菜单
JButtons
,如果鼠标悬停在这些元素上以模拟超链接导航,则这些元素看起来像标签,并带有下划线
这很好,但是我在按钮上使用了鼠标侦听器(不是操作侦听器,因为我希望能够注册鼠标悬停在按钮上,鼠标光标离开按钮等)和if语句来检查单击了哪个按钮/标签
if (e.getSource() == btn_orderStatus) {
// Clean everything, then hang in the MAIN navigation panel
buttonPanel.setVisible(true);
createLandingPage("centerPanel");
pageCards.show(centerPanel, "PageOne");
}
if (e.getSource() == btn_goBack) {
// Clean everything, then hang in the MAIN navigation panel
buttonPanel.setVisible(false);
createLandingPage("empty");
}
if (e.getSource() == btn_checkReport) {
...
}
由于以后导航可能会更长,我想将if语句
转换为开关盒
,然后检查单击了哪个按钮Switch case
主要用于int
、String
等类型,因此您必须切换字符串
当有一个ActionListener
注册到重新配置的JButtons
时,您可以像这样使用开关盒
:
switch(e.getActionCommand()) {
case: "Order status":
....
case: "Check reports":
....
}
注意:getActionCommand()
以前从未设置过!如果未设置,则默认为按钮文本强>
但由于我使用的是MouseListener
而不是ActionListener
,因此没有e.getActionCommand()
另一种选择是获取源代码并将其转换为JButton
,该按钮可以工作,但可能比它更长,也不那么优雅:
switch(((JButton) e.getSource.getText())){...
那么,有没有一种方法可以让鼠标侦听器开关
使用类似于e.getActionCommand()
的东西呢?还是cast方法已经可以接受
编辑:这是我的导航GIF,因此更容易理解我为什么要使用按钮
但要明确的是:我的问题不是关于视觉效果,而是是否有一种方式来写这句话
switch(((JButton) e.getSource.getText())){...
通过使用类似于e.getActionComman()
的东西来缩短/更优雅,这在MouseListener
中是不存在的
EDIT2:
这就是我如何将我的JButtons
更改为JLabels
:
for (JButton jButton : navigationButtonSecondList) {
jButton.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
jButton.setBorderPainted(true);
jButton.setContentAreaFilled(false);
jButton.setFocusPainted(false);
jButton.setHorizontalAlignment(SwingConstants.LEFT);
jButton.addMouseListener(this);
jButton.setEnabled(false);
jButton.setFont(new Font("SansSerif", Font.PLAIN, 12));
}
编辑3:
使用此代码,重新加工的JButtons
以粗体显示并加下划线。我还尝试使用按钮文本
,但不知何故,我无法正确地取消文本下划线。因此,我使用了如下所示的方法:
@Override
public void mouseEntered(MouseEvent e) {
// Makes the text in the labels / JButtons bold and "pop out", so the
// user sees, which label / JButton they are hovering over
JButton buttonSourceHelper = ((JButton) e.getSource());
buttonSourceHelper.setFont(new Font("SansSerif", Font.BOLD, 12));
// This is used to underline the labels (JButtons) in order to make them
// look like hyperlinks
Font font = buttonSourceHelper.getFont();
Map attributes = font.getAttributes();
attributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
buttonSourceHelper.setFont(font.deriveFont(attributes));
}
当鼠标退出JButton
时,我只需将字体大小恢复为12,然后PLAIN
:
buttonHelper.setFont(new Font("SansSerif", Font.PLAIN, 12));
。按钮(不是ActionListener,因为我希望能够注册鼠标悬停在按钮上…为什么?请看@AndrewThompson:当鼠标悬停在按钮/标签上时,字体将变为粗体并加下划线,如果鼠标离开按钮/标签,字体将变为普通且不再加下划线。此外,我并不反对使用不同的方法,我只是好奇是否有办法实现我在问题中描述的内容。这可能是achi通过将文本写入图像,并将其用作(正常)的图标来实现图标、悬停图标、按下图标等。另外,将文本加粗通常会使其变宽,这反过来可能会改变组件的位置。如果我要制作文本图标,我会先进行加粗,并使所有图标的大小与该图标的大小相同。@hamena314我仍然不确定您为什么要使用MouseStener。但您仍然可以添加广告d ActionListener即使您已经添加了鼠标侦听器,也可以将其添加到您的按钮上。这难道不能解决您的问题吗?除此之外,还有其他一些方法。@AndrewThompson:有趣的想法,尽管我不得不承认,我还没有看到使用图标而不是使用重新配置的按钮的优势,这些按钮看起来像JLabels
按钮可以通过键盘访问,而图标不会iirc?是的,将文本加粗会使文本占用更多的空间,但由于导航面板有相当大的空间,这不是问题。相反,用户会得到一个很好的可用性反馈,他确切地停留在哪个元素上。