为了账号安全,请及时绑定邮箱和手机立即绑定

AddMouseListener 到另一个 AddMouseListener

AddMouseListener 到另一个 AddMouseListener

慕慕森 2023-08-04 19:16:42
我在调用两个鼠标事件(一个进入另一个)时遇到问题。我想当用户单击第一帧 (frame1) 中的组件 (component1) 时显示第二帧 (frame2),然后如果单击 component2,则返回到上一帧 (frame1)。所有这些都使用一个文件。这是我写的:component1.addMouseListener(this on);@Overridepublic void mouseClicked(MouseEvent e) {    if(e.getSource() == component1)    {        frame1.dispose();        frame2.setVisible(true);        component2.addMouseListener(new MouseAdapter() {            public void mouseClicked() {            frame2.dispose();            frame1.setVisible(true);            }         });    }}第一个事件有效,但第二个事件无效。谢谢您的回答。
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

这是一个功能齐全的示例,其中有 2 个框架,每个框架都有一个标签,单击该标签时,会隐藏一个框架并显示另一个框架,这是在 Java 10 中完成的。看看这是否适合您,并解释您的代码与此有何不同。请注意,我只创建了 2 个 MouseListener,每一帧一个。我没有在其他 MouseListener 的代码中重新创建 MouseListener。另外,我没有处理框架,这可能会导致问题。如果我已经处理了frame1,我很可能必须创建一个新的JFrame并将其分配给frame1实例成员。


请注意,您必须单击标签本身,而不是框架上的其他位置。


import javax.swing.*;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;


public class TwoFrames {


    public static void main(String[] args) {

        TwoFrames twoFrames = new TwoFrames();

        twoFrames.start();

    }


    private void start() {

        setupFrames();

    }


    JFrame frame1 = new JFrame("Frame 1"),

           frame2 = new JFrame("Frame 2");


    JLabel component1 = new JLabel("Click me 1"),

           component2 = new JLabel("Click me 2");


    private void setupFrames() {

        frame1.getContentPane().add(component1);

        frame2.getContentPane().add(component2);


        component1.setOpaque(true);

        component2.setOpaque(true);


        component1.addMouseListener(new MouseAdapter() {

            @Override

            public void mouseClicked(MouseEvent e) {

                frame1.setVisible(false);

                frame2.setVisible(true);

            }

        });


        component2.addMouseListener(new MouseAdapter() {

            @Override

            public void mouseClicked(MouseEvent e) {

                frame2.setVisible(false);

                frame1.setVisible(true);

            }

        });


        frame1.setSize(300, 300);

        frame2.setSize(400, 400);


        frame1.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame2.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


        SwingUtilities.invokeLater(() -> frame1.setVisible(true));

    }

}


查看完整回答
反对 回复 2023-08-04
?
不负相思意

TA贡献1777条经验 获得超10个赞

dispose()方法实际上破坏了窗口,因此,frame1 应该变成null,并且您很可能会遇到空指针异常。

考虑调用frame1.setVisible(false)andframe2.setVisible(false)而不是该dispose()方法。

另外,您可以考虑使用分离鼠标侦听器对象,而不是在单击组件 1 时向组件 2 添加新的鼠标侦听器。


查看完整回答
反对 回复 2023-08-04
  • 2 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信