Java 来自子类 obj 的陷阱事件
Java trap events from subclasses obj
在我的 class 中,我想在主 JPanel 中添加在子 class 中动态创建的其他 JPanel obj,并捕获确切知道 obj 生成它的鼠标事件。
我尝试通过创建一个 subclass DoSquare (JPanel extend) 来做到这一点,添加侦听器,创建 objs 并绘制该 subclass 的图形,但是当我 运行 程序并单击一个在创建的 DoSquare 对象中,e.getSource() return 始终是 SubObj 对象而不是单击的元素。
我怎样才能准确区分在侦听器事件中选择的组件?
这是我的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SubObj extends JPanel {
Listener listener = new Listener();
DoSquare firstQ = new DoSquare(100, 50);
DoSquare secondQ = new DoSquare(200, 70);
public static void main(String[] args) {
JFrame panel = new JFrame();
SubObj content = new SubObj();
panel.setContentPane(content);
panel.setFocusable(true);
panel.setSize(400, 400);
panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setVisible(true);
}
SubObj() {
addMouseListener(listener);
addFocusListener(listener);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
firstQ.draw(g, Color.BLACK);
secondQ.draw(g, Color.CYAN);
}
private class DoSquare extends JPanel {
private int coordX;
private int coordY;
Listener squareLis = new Listener();
DoSquare(int X, int Y) {
addMouseListener(squareLis);
addFocusListener(squareLis);
coordX = X;
coordY = Y;
}
void draw(Graphics g, Color c) { // Draw the square
g.setColor(c);
g.fillRect(coordX, coordY, 50, 50);
}
}
public class Listener implements MouseListener, FocusListener {
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
System.out.println(e.getSource());
}
public void mouseReleased(MouseEvent e) {}
public void focusGained(FocusEvent e) {}
public void focusLost(FocusEvent e) {}
}
}
提前致谢
上午
在你的 SubObj
class 的构造函数中,你应该做:
SubObj() {
firstQ.addMouseListener(listener);
secondQ.addFocusListener(listener);
}
并删除 DoSquare
class 中的 squareLis
变量。
更新
public class SubObj extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
SubObj content = new SubObj();
frame.setContentPane(content);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
SubObj() {
MouseAdapter mouseAdapter = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(e.getSource());
System.out.println("click from " + ((TestPanel) e.getSource()).getId());
}
};
JPanel testPanel1 = new TestPanel("1");
testPanel1.setPreferredSize(new Dimension(200, 200));
testPanel1.setBackground(Color.BLACK);
testPanel1.addMouseListener(mouseAdapter);
add(testPanel1);
JPanel testPanel2 = new TestPanel("2");
testPanel2.setPreferredSize(new Dimension(100, 100));
testPanel2.setBackground(Color.RED);
testPanel2.addMouseListener(mouseAdapter);
add(testPanel2);
}
private class TestPanel extends JPanel {
private String id;
TestPanel(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
}
我上面写的代码相当于你想要实现的,它按照你想要的方式工作。我不使用你的代码,因为我不确定你到底想要它是什么。我的代码是为了演示两个子面板在被点击时如何响应鼠标事件,这是我们解决这个问题的重点。
在我的 class 中,我想在主 JPanel 中添加在子 class 中动态创建的其他 JPanel obj,并捕获确切知道 obj 生成它的鼠标事件。 我尝试通过创建一个 subclass DoSquare (JPanel extend) 来做到这一点,添加侦听器,创建 objs 并绘制该 subclass 的图形,但是当我 运行 程序并单击一个在创建的 DoSquare 对象中,e.getSource() return 始终是 SubObj 对象而不是单击的元素。 我怎样才能准确区分在侦听器事件中选择的组件?
这是我的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SubObj extends JPanel {
Listener listener = new Listener();
DoSquare firstQ = new DoSquare(100, 50);
DoSquare secondQ = new DoSquare(200, 70);
public static void main(String[] args) {
JFrame panel = new JFrame();
SubObj content = new SubObj();
panel.setContentPane(content);
panel.setFocusable(true);
panel.setSize(400, 400);
panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setVisible(true);
}
SubObj() {
addMouseListener(listener);
addFocusListener(listener);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
firstQ.draw(g, Color.BLACK);
secondQ.draw(g, Color.CYAN);
}
private class DoSquare extends JPanel {
private int coordX;
private int coordY;
Listener squareLis = new Listener();
DoSquare(int X, int Y) {
addMouseListener(squareLis);
addFocusListener(squareLis);
coordX = X;
coordY = Y;
}
void draw(Graphics g, Color c) { // Draw the square
g.setColor(c);
g.fillRect(coordX, coordY, 50, 50);
}
}
public class Listener implements MouseListener, FocusListener {
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
System.out.println(e.getSource());
}
public void mouseReleased(MouseEvent e) {}
public void focusGained(FocusEvent e) {}
public void focusLost(FocusEvent e) {}
}
}
提前致谢
上午
在你的 SubObj
class 的构造函数中,你应该做:
SubObj() {
firstQ.addMouseListener(listener);
secondQ.addFocusListener(listener);
}
并删除 DoSquare
class 中的 squareLis
变量。
更新
public class SubObj extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
SubObj content = new SubObj();
frame.setContentPane(content);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
SubObj() {
MouseAdapter mouseAdapter = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(e.getSource());
System.out.println("click from " + ((TestPanel) e.getSource()).getId());
}
};
JPanel testPanel1 = new TestPanel("1");
testPanel1.setPreferredSize(new Dimension(200, 200));
testPanel1.setBackground(Color.BLACK);
testPanel1.addMouseListener(mouseAdapter);
add(testPanel1);
JPanel testPanel2 = new TestPanel("2");
testPanel2.setPreferredSize(new Dimension(100, 100));
testPanel2.setBackground(Color.RED);
testPanel2.addMouseListener(mouseAdapter);
add(testPanel2);
}
private class TestPanel extends JPanel {
private String id;
TestPanel(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
}
我上面写的代码相当于你想要实现的,它按照你想要的方式工作。我不使用你的代码,因为我不确定你到底想要它是什么。我的代码是为了演示两个子面板在被点击时如何响应鼠标事件,这是我们解决这个问题的重点。