当前位置: 首页 > 知识库问答 >
问题:

我可以用JAVA中的几个JButton更改一个独特的MouseListener方法吗?

臧正平
2023-03-14

我想做的是在点击按钮1时在面板上设置一个鼠标听筒。然后,我想点击另一个按钮,改变MouseListener代码来做其他事情。

  1. 点击JButton1-

我不知道如何修改一个独特的鼠标听筒。

我试着设置一个按钮。为每个按钮执行操作(新的jLabel1.addMouseListener()),但它们会创建两个MouseListener实例。

我不想设置一个MouseListener为几个JButton,但几个JButton改变我的MouseListener的状态。

非常感谢:)

共有1个答案

吴经略
2023-03-14

最好从一开始就给JLabel一个MouseListener,但如果是布尔型的if块,它将根据类布尔字段的状态打开或关闭功能。在按钮ActionListeners中,只需更改这些布尔字段的状态。例如,在下面的代码中,布尔标志labellistenron在第一个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);
    }
}

如果你想变得更有趣,可以在M-V-C中查找“model view controller”,在这里你可以将程序逻辑(这里是布尔标志的状态)与程序视图代码(Swing GUI代码)分离,通常在它们自己的类中,然后使用一个主类来连接所有组件。这将增加一层间接性和复杂性,在这种情况下,这将是致命的,但在大型程序中,尤其是在可能会被更新、更改和扩展的程序中,从长远来看,这实际上会降低复杂性,并使程序更“可伸缩”——更易于扩展和修改。同样,我不建议你在这里这样做,但一定要仔细查看,以备将来可能使用。

 类似资料:
  • 问题内容: 假设我有类,并且其中的类具有可读和可写的属性: 是否可以只使用该方法而只使用该方法? 问题答案: 不可以,无法分配每个类别的访问权限。 考虑将您的类分为单独的接口,以便每个类仅获得一个具有所需接口的对象。例如: 当然,这涉及安全性,但这应该使您朝正确的方向进行思考。

  • 我的GUI有一个从db文件筛选出的条目列表。对于每个条目,我都有一个selectjbutton,它显示每个条目的更多细节。 我试图实现的是让selectjbutton在按下时更改颜色,并在选择其他条目的按钮时恢复为原始颜色。 我目前拥有的代码将很好地更改所选颜色的按钮,但在选择其他条目的“详细信息”按钮时仍保持相同的颜色: 如何更改代码以获得此效果?

  • 问题内容: 我试图衡量几种方法的执行时间。所以我在想做一个方法,而不是多次重复相同的代码。 这是我的代码: 假设我有,如何使用它来衡量执行时间? 问题答案: 方法不是Java中的一流对象,因此不能将它们作为参数传递。您可以将方法调用包装在扩展例如接口的匿名类中:

  • 有没有一种方法让JSF支持bean导致页面上组件的更新?我不希望使用带有update属性的ajax组件来更新页面上的组件。我需要从JSF backing bean方法中触发更新。注页面上的更新可能发生在此方法完成之后或完成之前。我正在使用PrimeFaces,如果使用PrimeFaces有一个解决方案的话。

  • 我正在创建一个测验,并创建了一个具有JFrame的类,它的作用类似于主菜单。在这个菜单上,我创建了一个JButton,我想打开单独的JDialog(其中包含问题等)。 JDialog是一个名为QuestionDialog.java独立类 这里是我在主菜单JFrame类中的代码,特别是我要打开新JDialog public static void main(String[]args){SwingUt