Java 带mouseEvent处理的JPanel边界
如何创建能够处理MouseEvents的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
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 . . .