如何解决我可以在JAVA中使用几个JButton更改唯一的MouseListener方法吗?
目标
我要做的是单击Button1时在面板上设置一个MouseListener。 然后,我想单击另一个将MouseListener代码更改为其他功能的按钮。
应用示例
- 单击JButton1->添加MouseListener,将JLabel背景颜色更改为红色。
- 单击JButton2->不要添加新的MouseListener,但是将第一个更改为将JLabel文本设置为“ hello world”
我不能做的事
我不知道如何修改UNIQUE MouseListener。
我尝试过的
我尝试为每个按钮设置一个jButton.actionPerformed(new jLabel1.addMouseListener()),但是它们创建了MouseListener的两个实例。
我不想为多个JButton设置一个MouseListener,而是为多个JButton更改MouseListener的状态。
非常感谢:)
解决方法
最好从一开始就给JLabel一个MouseListener,但给它提供布尔型if-blocks,它将根据类布尔值字段的状态打开或关闭功能。在按钮ActionListeners中,只需更改这些布尔字段的状态即可。例如,在下面的代码中,布尔标志labelListenerOn
在第一个JButton的ActionListener中被打开或关闭。 JLabel的MouseListener会检查此变量的状态,并在标记仅为true的情况下更改标签的背景色。对于另一个布尔标志和其他ActionListener,也是如此:
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class ButtonListener extends JPanel {
private static final String TURN_ON_MOUSE = "Turn On Mouse";
private static final String TURN_OFF_MOUSE = "Turn Off Mouse";
private JButton button1 = new JButton(TURN_ON_MOUSE);
private JButton button2 = new JButton("Button 2");
private JLabel label1 = new JLabel("Label 1");
private MouseListener labelListener = new LabelListener();
private boolean labelListenerOn = false;
private boolean labelChangeText = false;
public ButtonListener() {
label1.setOpaque(true);
label1.addMouseListener(labelListener);
button1.addActionListener(e -> {
if (labelListenerOn) {
labelListenerOn = false;
((JButton) e.getSource()).setText(TURN_ON_MOUSE);
} else {
labelListenerOn = true;
((JButton) e.getSource()).setText(TURN_OFF_MOUSE);
}
});
button2.addActionListener(e -> {
labelChangeText = true;
});
add(button1);
add(button2);
add(label1);
}
private class LabelListener extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
Color labelColor = label1.getBackground();
if (labelListenerOn) {
if (labelColor.equals(Color.RED)) {
label1.setBackground(null);
} else {
label1.setBackground(Color.RED);
}
// label1.repaint(); // per Rob Camick's comment,this is not necessary
}
if (labelChangeText) {
label1.setText("Hello World");
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private static void createAndShowGui() {
ButtonListener mainPanel = new ButtonListener();
JFrame frame = new JFrame("ButtonListener");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
}
如果想花哨的话,请在MVC中查找“ model-view-controller”,在其中,您通常将程序逻辑(此处为布尔标志的状态)与程序视图代码(Swing GUI代码)分开。在自己的类中,然后使用主类将所有组件连接起来。这会增加一层间接性和复杂性,并且在这种情况下会显得过分杀伤,但是在大型程序中,尤其是在可能会进行更新,更改和增长的程序中,这实际上会 reduce 从长远来看很复杂,并使程序更具“可伸缩性”-易于扩展和修改。同样,我不建议您在这里进行此操作,但请仔细检查以备将来使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。