猿问

AddMouseListener 到另一个 AddMouseListener

我在调用两个鼠标事件(一个进入另一个)时遇到问题。我想当用户单击第一帧 (frame1) 中的组件 (component1) 时显示第二帧 (frame2),然后如果单击 component2,则返回到上一帧 (frame1)。所有这些都使用一个文件。这是我写的:


component1.addMouseListener(this on);


@Override

public 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);

            } 

        });

    }

}

第一个事件有效,但第二个事件无效。谢谢您的回答。


慕慕森
浏览 172回答 2
2回答

萧十郎

这是一个功能齐全的示例,其中有 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));    }}

不负相思意

该dispose()方法实际上破坏了窗口,因此,frame1 应该变成null,并且您很可能会遇到空指针异常。考虑调用frame1.setVisible(false)andframe2.setVisible(false)而不是该dispose()方法。另外,您可以考虑使用分离鼠标侦听器对象,而不是在单击组件 1 时向组件 2 添加新的鼠标侦听器。
随时随地看视频慕课网APP

相关分类

Java
我要回答