Java 如何在JFrame的内部框架中单击,而不使用按钮

Java 如何在JFrame的内部框架中单击,而不使用按钮,java,swing,Java,Swing,我目前正在使用内部框架制作应用程序,我不想在内部框架中使用按钮。我希望它了解我点击的位置(特定坐标),并根据点击的位置完成操作 这是一个内部框架,我目前正试图让他鼠标点击注册 package com.xxemu.main; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.ImageIcon;

我目前正在使用内部框架制作应用程序,我不想在内部框架中使用按钮。我希望它了解我点击的位置(特定坐标),并根据点击的位置完成操作

这是一个内部框架,我目前正试图让他鼠标点击注册

package com.xxemu.main;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;

public class Techni extends JInternalFrame implements InternalFrameListener, MouseListener {

    private static final long serialVersionUID = -7905672790566329537L;
    static int openFrameCount = 0;
    private ImageIcon image;
    private JLabel label;
    private Menu menu;
    public int frame = 1;
    static final int xOffset = 75, yOffset = 90;

    public Techni() {
        super("emu",
        true, //resizable
        true, //closable
        true, //maximizable
        true); //iconifiable
        //setSize(783, 522);
        setSize(400, 400);

        setLocation(xOffset, yOffset);
    }
    public void setLayeredPane(JLayeredPane layered) {
        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                System.out.println("asdfsd");
                if (e.getX() < 0 && e.getY() > 0) {
                    System.out.println("test");
                }

            }
        });
    }@Override
    public void internalFrameActivated(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameClosed(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameClosing(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameDeactivated(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameDeiconified(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameIconified(InternalFrameEvent arg0) {}

    @Override
    public void internalFrameOpened(InternalFrameEvent arg0) {}@Override
    public void mouseEntered(MouseEvent e) {}@Override
    public void mouseExited(MouseEvent e) {}@Override
    public void mousePressed(MouseEvent e) {}@Override
    public void mouseReleased(MouseEvent e) {}@Override
    public void mouseClicked(MouseEvent e) {}
}

您可以将
MouseListener
添加到
组件
实例中,该实例具有带有x和y坐标的
mouseClicked
事件

例如:

component.addMouseListener(new MouseAdapter() {

    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int xOnScreen = e.getXOnScreen();

        int y = e.getY();
        int yOnScreen = e.getYOnScreen();
    }

});

我在编写GUI时使用了一种方法,该GUI在一个框架内显示鼠标坐标

private static void debugMousePosition(JFrame frame) {
    final JFrame box = new JFrame("Mouse Position");
    box.setAlwaysOnTop(true);
    box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    box.setLocation(frame.getX() + 800,frame.getY());
    box.setSize(300, 100);
    box.setLayout(new GridLayout(1,2));
    box.setVisible(true);
    final JLabel X = new JLabel();
    final JLabel Y = new JLabel();
    frame.addMouseMotionListener(new MouseAdapter() {
        public void mouseMoved(MouseEvent me) {
            X.setText(String.valueOf("X Position: " + me.getX()));
            Y.setText(String.valueOf("Y Position: " + me.getY()));
            box.repaint();
        }
    });
    box.add(X);
    box.add(Y);

}
将要监视的帧传递给debugMousePosition()方法

似乎您希望使用MouseActionListener来查看用户何时单击,然后onClick将从MouseMotionListener获取鼠标信息。大概是

frame.addMouseListener(new MouseAdapter(){

   @Override
   public void mouseClicked(MouseEvent e)
   {
       if(e.getX() == someVariable && e.getY() == anotherVariable)
       {
          do something here
       }
   }
});
如果您需要更多的功能,比如当鼠标离开框架时,请查看该类以查看它拥有的其他方法

当您实现诸如InternalFrameListener之类的类时,需要您重写其中包含的方法。与此相反,请尝试只导入适配器版本,并在需要时从中创建新的适配器。就像我上面的代码一样,您可以使用InternalFrameAdapter执行类似的操作

以下是我建议你们的班级的样子:

package com.xxemu.main;
import java.awt.Menu;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;

public class Techni extends JInternalFrame
{

    private static final long serialVersionUID = -7905672790566329537L;
    static int openFrameCount = 0;
    private ImageIcon image;
    private JLabel label;
    private Menu menu;
    public int frame = 1;
    static final int xOffset = 75, yOffset = 90;

    public Techni()
    {
        super("emu",
              true, //resizable
              true, //closable
              true, //maximizable
              true);//iconifiable
        //setSize(783, 522);
        setSize(400, 400);

        setLocation(xOffset, yOffset);
    }

    public void setLayeredPane(JLayeredPane layered)
    {
        addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                System.out.println("asdfsd");
                if (e.getX() < 0 && e.getY() > 0)
                {
                    System.out.println("test");
                }

            }
        });
    }
}
package com.xxemu.main;
导入java.awt.Menu;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.ImageIcon;
导入javax.swing.JInternalFrame;
导入javax.swing.JLabel;
导入javax.swing.JLayeredPane;
公共类Techni扩展JInternalFrame
{
私有静态最终长serialVersionUID=-7905672790566329537L;
静态int openFrameCount=0;
私有图像图标图像;
私人标签;
私人菜单;
公共int帧=1;
静态最终int xOffset=75,yOffset=90;
公共技术()
{
超级(“emu”,
true,//可调整大小
true,//可关闭
true,//可最大化
true);//可图标化
//设置大小(783522);
设置大小(400400);
设置位置(xOffset,yOffset);
}
公共void setLayeredPane(JLayeredPane分层)
{
addMouseListener(新的MouseAdapter()
{
@凌驾
公共无效mouseClicked(MouseEvent e)
{
System.out.println(“asdfsd”);
如果(e.getX()<0&&e.getY()>0)
{
系统输出打印(“测试”);
}
}
});
}
}

我可能创建了错误的框架,但我必须扩展JFrame和JInternalFrame,因此我无法扩展MouseAdapter。您不需要将其添加到类声明中,只需包含一个导入(
import java.awt.event.MouseAdapter;
)并将上面的代码用作处理的模板,我只是在代码中遗漏了一些东西。只需要让它继续为我工作。我不知道我做错了什么。看一看,让我知道什么可能是不正确的?如果你把它添加到原始帖子中,我可以查看它。检查我的答案,我已经修改了底部部分来解释如何使用这些。你的帖子末尾有一个零散的
}
,这是应该匹配上面的内容还是仅仅是噪音?不,这一切都匹配。我的括号很好。它只是无法识别框架内,甚至外部框架内的点击。他说的是你的代码格式。有一个迷路的}那是为了下课。是的,刚刚看到。哈哈
package com.xxemu.main;
import java.awt.Menu;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;

public class Techni extends JInternalFrame
{

    private static final long serialVersionUID = -7905672790566329537L;
    static int openFrameCount = 0;
    private ImageIcon image;
    private JLabel label;
    private Menu menu;
    public int frame = 1;
    static final int xOffset = 75, yOffset = 90;

    public Techni()
    {
        super("emu",
              true, //resizable
              true, //closable
              true, //maximizable
              true);//iconifiable
        //setSize(783, 522);
        setSize(400, 400);

        setLocation(xOffset, yOffset);
    }

    public void setLayeredPane(JLayeredPane layered)
    {
        addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                System.out.println("asdfsd");
                if (e.getX() < 0 && e.getY() > 0)
                {
                    System.out.println("test");
                }

            }
        });
    }
}