我可以在 JAVA 中用几个 JButton 改变一个独特的 MouseListener 方法吗?
Can I change an unique MouseListener methods with several JButton in JAVA?
目标
我想做的是在单击 Button1 时在面板上设置 MouseListener。
然后我想单击另一个更改 MouseListener 代码的 Button 来执行其他操作。
应用示例
- 单击 JButton1 -> 添加将 JLabel 背景颜色更改为红色的 MouseListener。
- 单击 JButton2 -> 不添加新的 MouseListener,但更改第一个以将 JLabel 文本设置为“hello world”
我不能做什么
我不知道如何修改 UNIQUE MouseListener。
我试过的
我试图为每个按钮设置一个 jButton.actionPerformed( new jLabel1.addMouseListener()),但它们创建了两个 MouseListener 实例。
我不想为多个 JButton 设置一个 MouseListener,但多个 JButton 会改变我的 MouseListener 的状态。
非常感谢:)
最好给 JLabel 一个来自 get-go 的 MouseListener,但给它一个布尔值 if-blocks,它将根据 class 布尔字段的状态打开或关闭功能。在您的按钮 ActionListeners 中,只需更改这些布尔字段的状态。例如,在下面的代码中,布尔标志 labelListenerOn
在第一个 JButton 的 ActionListener 中打开或关闭。 JLabel 的 MouseListener 检查此变量的状态并仅在标志为真时更改标签背景颜色。同样对于其他布尔标志和其他 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);
}
}
如果你想花哨一点,在 M-V-C 中查找“model-view-controller”,你可以在其中将程序逻辑(这里是布尔标志的状态)与程序视图代码( Swing GUI 代码),通常在它们自己的 classes 中,然后使用主程序 class 将所有组件连接起来。这会增加额外的间接层和复杂性,在这种情况下会 over-kill,但在大型程序中,尤其是在可能要更新、更改和增长的程序中,这实际上会 减少 长运行 的复杂性,并使程序更“可扩展”——更容易增长和修改。同样,我不建议您在此处执行此操作,但请仔细阅读以备将来使用。
目标
我想做的是在单击 Button1 时在面板上设置 MouseListener。 然后我想单击另一个更改 MouseListener 代码的 Button 来执行其他操作。
应用示例
- 单击 JButton1 -> 添加将 JLabel 背景颜色更改为红色的 MouseListener。
- 单击 JButton2 -> 不添加新的 MouseListener,但更改第一个以将 JLabel 文本设置为“hello world”
我不能做什么
我不知道如何修改 UNIQUE MouseListener。
我试过的
我试图为每个按钮设置一个 jButton.actionPerformed( new jLabel1.addMouseListener()),但它们创建了两个 MouseListener 实例。
我不想为多个 JButton 设置一个 MouseListener,但多个 JButton 会改变我的 MouseListener 的状态。
非常感谢:)
最好给 JLabel 一个来自 get-go 的 MouseListener,但给它一个布尔值 if-blocks,它将根据 class 布尔字段的状态打开或关闭功能。在您的按钮 ActionListeners 中,只需更改这些布尔字段的状态。例如,在下面的代码中,布尔标志 labelListenerOn
在第一个 JButton 的 ActionListener 中打开或关闭。 JLabel 的 MouseListener 检查此变量的状态并仅在标志为真时更改标签背景颜色。同样对于其他布尔标志和其他 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);
}
}
如果你想花哨一点,在 M-V-C 中查找“model-view-controller”,你可以在其中将程序逻辑(这里是布尔标志的状态)与程序视图代码( Swing GUI 代码),通常在它们自己的 classes 中,然后使用主程序 class 将所有组件连接起来。这会增加额外的间接层和复杂性,在这种情况下会 over-kill,但在大型程序中,尤其是在可能要更新、更改和增长的程序中,这实际上会 减少 长运行 的复杂性,并使程序更“可扩展”——更容易增长和修改。同样,我不建议您在此处执行此操作,但请仔细阅读以备将来使用。