【问题标题】:Java trap events from subclasses obj来自子类 obj 的 Java 陷阱事件
【发布时间】:2016-11-06 10:58:09
【问题描述】:

在我的班级中,我想将其他 JPanel obj 添加到主 JPanel 中,这些 JPanel obj 是在子类中动态创建的,并捕获鼠标事件,确切地知道女巫 obj 会生成它。 我尝试通过创建子类 DoSquare (JPanel extend)、添加侦听器、创建 obj 并绘制该子类的图形来做到这一点,但是当我运行程序并单击创建的 DoSquare obj 之一时,e.getSource() 总是返回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) {}
 }

}

提前致谢

上午

【问题讨论】:

    标签: java swing object events awt


    【解决方案1】:

    在你的 SubObj 类的构造函数中,你应该这样做:

    SubObj() {
        firstQ.addMouseListener(listener);
        secondQ.addFocusListener(listener);
    }
    

    并删除DoSquare 类中的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;
            }
        }
    }
    

    我上面写的代码相当于你想要实现的,它按照你想要的方式工作。我不使用您的代码,因为我不确定您到底想要它是什么。我的代码用于演示两个子面板在被点击时如何响应鼠标事件,这是我们解决这个问题的重点。

    【讨论】:

    • 您好,感谢您的回复,我尝试按照您的建议更改监听器,但结果没有改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多