Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带mouseEvent处理的JPanel边界_Java_Swing_Border_Mouselistener - Fatal编程技术网

Java 带mouseEvent处理的JPanel边界

Java 带mouseEvent处理的JPanel边界,java,swing,border,mouselistener,Java,Swing,Border,Mouselistener,如何创建能够处理MouseEvents的JPanel边框 我试着这样做: abstract public class MyBorder extends LineBorder implements MouseListener 但是在实现了虚拟方法之后,我不能将mouseStener分配给我的类。我想,我必须把它分配到某个JComponent中 那么,如何使用mouseListener创建某种边框呢?必须将mouseListener添加到组件,而不是边框。因此,要使用您的类,代码需要如下所示: B

如何创建能够处理MouseEvents的JPanel边框

我试着这样做:

abstract public class MyBorder extends LineBorder implements MouseListener
但是在实现了虚拟方法之后,我不能将mouseStener分配给我的类。我想,我必须把它分配到某个JComponent中


那么,如何使用mouseListener创建某种边框呢?

必须将mouseListener添加到组件,而不是边框。因此,要使用您的类,代码需要如下所示:

Border border = new MyBorder();
panel.setBorder( border );
panel.addMouseListener( border );

这是一个SSCCE,它支持在应用鼠标事件的组件上获取鼠标事件

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

class BorderListener {

    private void initGui() {
        final JPanel gui = new JPanel();
        gui.setBackground(Color.green);
        gui.setPreferredSize(new Dimension(300,50));
        gui.setBorder(new LineBorder(Color.blue, 10));
        gui.addMouseListener( new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                System.out.println(me.getPoint());
            }
        });
        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                BorderListener bl = new BorderListener();
                bl.initGui();
            }
        });
    }
}
典型输出 单击分配给此面板的宽边框时,您可能会看到沿这些线的输出

java.awt.Point[x=8,y=3]
java.awt.Point[x=3,y=26]
java.awt.Point[x=1,y=43]
java.awt.Point[x=15,y=6]
java.awt.Point[x=101,y=5]
java.awt.Point[x=220,y=4]
java.awt.Point[x=287,y=5]
java.awt.Point[x=295,y=3]
Press any key to continue . . .
边界宽度为10px,因此如果(x | | y<10),则它位于线边界内


使现代化 (对camickr的评论,也适用于我的回答)


是的,但是整个JPanel将添加此鼠标侦听器。不仅仅是为了我的边境。我错了吗

如果事件发生在面板的非边界区域,请忽略该事件

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

class BorderListener {

    private void initGui() {
        final JPanel gui = new JPanel();
        gui.setBackground(Color.yellow);
        gui.setPreferredSize(new Dimension(300,50));
        gui.setBorder(new LineBorder(Color.orange, 15));
        gui.addMouseListener( new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                int w = gui.getWidth();
                int h = gui.getHeight();
                int x = me.getPoint().x;
                int y = me.getPoint().y;
                Insets ins = gui.getInsets();
                boolean inBorder =
                    ( x<ins.left ||
                    x>w-ins.right ||
                    y<ins.top ||
                    y>h-ins.bottom);
                if (inBorder) {
                    System.out.println(me.getPoint());
                } else {
                    System.out.println("Ignore!");
                }
            }
        });
        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                BorderListener bl = new BorderListener();
                bl.initGui();
            }
        });
    }
}

你是说,当你把监听器添加到面板中,而将其悬停在面板的边界上时,监听器不会被触发吗?我觉得很难相信。你能添加一个显示效果的鼠标吗?是的,但是这个鼠标听写器将被添加到整个JPanel中。不仅仅是为了我的边境。我错了吗?您可以始终忽略边框内的事件。您是正确的,但您可以始终检查鼠标点是否在面板的插图中。或者另一个选项是将一个面板嵌套在另一个面板中。然后,内部面板将覆盖外部面板。phaaa不,永远看不到向下投票的原因,我的视图/图像将以类似的方式(:我默认仅使用JFrame:-),可能会通知Jeannet关于setPreferredSize而不是setSize,但这是Swing中reall top\u hight\u级别GUI编程(习惯)的详细信息
java.awt.Point[x=168,y=7]
Ignore!
java.awt.Point[x=164,y=41]
java.awt.Point[x=297,y=39]
java.awt.Point[x=297,y=21]
Ignore!
Ignore!
java.awt.Point[x=2,y=21]
Press any key to continue . . .