AddMouseListener 到另一个 AddMouseListener
AddMouseListener into another AddMouseListener
我在调用两个鼠标事件时遇到问题,一个调用另一个。我想在用户从第一帧 (frame1) 单击组件 (component1) 时显示第二帧 (frame2),如果单击组件 2,则 returns 到前一帧 (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);
}
});
}
}
第一个事件有效,但第二个事件无效。
谢谢你的回答。
dispose()
方法实际上破坏了 window,因此,frame1 应该变成 null
,您很可能会遇到空指针异常。
考虑调用 frame1.setVisible(false)
和 frame2.setVisible(false)
而不是 dispose()
方法。
另外,您可以考虑使用分离鼠标侦听器对象,而不是在单击 component1 时向 component2 添加新的鼠标侦听器。
这是一个功能齐全的示例,其中有 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));
}
}
我在调用两个鼠标事件时遇到问题,一个调用另一个。我想在用户从第一帧 (frame1) 单击组件 (component1) 时显示第二帧 (frame2),如果单击组件 2,则 returns 到前一帧 (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);
}
});
}
}
第一个事件有效,但第二个事件无效。 谢谢你的回答。
dispose()
方法实际上破坏了 window,因此,frame1 应该变成 null
,您很可能会遇到空指针异常。
考虑调用 frame1.setVisible(false)
和 frame2.setVisible(false)
而不是 dispose()
方法。
另外,您可以考虑使用分离鼠标侦听器对象,而不是在单击 component1 时向 component2 添加新的鼠标侦听器。
这是一个功能齐全的示例,其中有 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));
}
}