java - 监听器调用另一个监听器

标签 java swing listener

在使用 Swing 创建菜单的类中,我添加了 4 个项目,每个项目负责绘制一个不同颜色的圆圈。我已经为该菜单的每个项目分配了一个 ActionListener,只是为了指定所需圆圈的颜色。我需要在面板中的任意位置单击鼠标,然后创建圆圈。为此,我创建了另一个 ScrollPane 类,它实现 mouseListener 并负责绘制圆圈。但我不知道如何触发第二个类的 mouseListener 来完成这项工作。仅应在调用菜单监听器后执行此操作。显然,我需要对类 ScrollPane 的引用,然后在其上分配 mouseListener。

但是我不知道应该对 addMouseListener 方法使用什么样的参数。或者这是在 ScrollPane 类中声明的?我认为如果所有任务都在一个实现两个监听器的类中执行,那么这很简单,但是如果我想将它们分开怎么办?actionPerformed 还应该做什么? 相关代码如下:

public class CreateMenu implements ActionListener {
    private ScrollPane scrollPane;

    public void actionPerformed(ActionEvent e) {
        JMenuItem source = (JMenuItem)(e.getSource());
        if(source.getText() == "Green Circle")
            this.scrollPane.setColor(Color.green);
         else if(source.getText() == "Blue Circle")
             this.scrollPane.setColor(Color.blue);
         else if(source.getText() == "Red Circle")
             this.scrollPane.setColor(Color.red);
         else if(source.getText() == "Yellow Circle")
             this.scrollPane.setColor(Color.yellow);
         else
             return;
     }
}

.

public class ScrollPane extends JPanel implements MouseListener {
    private Dimension area;
    private Vector<Circle> circles;
    private Color color;
    private JPanel drawingPane;

    public ScrollPane() {
        super(new BorderLayout());

        area = new Dimension(0,0);
        circles = new Vector<Circle>();

        //Set up the drawing area.
        drawingPane = new DrawingPane();
        drawingPane.setBackground(Color.white);
        drawingPane.addMouseListener(this);

        //Put the drawing area in a scroll pane.
        JScrollPane scroller = new JScrollPane(drawingPane);
        scroller.setPreferredSize(new Dimension(200,200));

        add(scroller, BorderLayout.CENTER);
    }

    public class DrawingPane extends JPanel {
        protected void paintComponent(Graphics g, Color color ) {
            super.paintComponent(g);

            Rectangle rect;
            for (int i = 0; i < circles.size(); i++) {
                rect = circles.elementAt(i).getRect();
                g.setColor(circles.elementAt(i).getTheColor());
                g.fillOval(rect.x, rect.y, rect.width, rect.height);
            }
        }
    }

    public void mouseReleased(MouseEvent e) {
        final int W = 100;
        final int H = 100;
        boolean changed = false;

        if(SwingUtilities.isLeftMouseButton(e)) {
            int x = e.getX() - W/2;
            int y = e.getY() - H/2;
            if (x < 0) x = 0;
            if (y < 0) y = 0;
            Rectangle rect = new Rectangle(x, y, W, H);
            Circle newCircle = new Circle(rect, this.color);
            circles.addElement(newCircle);
            drawingPane.scrollRectToVisible(rect);

            int this_width = (x + W + 2);
            if (this_width > area.width) {
                area.width = this_width; changed=true;
            }

            int this_height = (y + H + 2);
            if (this_height > area.height) {
                area.height = this_height; changed=true;
            }
        }
        if (changed) {
            //Update client's preferred size because
            //the area taken up by the graphics has
            //gotten larger or smaller (if cleared).
            drawingPane.setPreferredSize(area);

            //Let the scroll pane know to update itself
            //and its scrollbars.
            drawingPane.revalidate();
        }
        drawingPane.repaint();
    }
    public void mouseClicked(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mousePressed(MouseEvent e){}


    public void setColor(Color color) {
        this.color = color;
    }

    public JPanel getDrawingPane() {
        return drawingPane;
    }
}

最佳答案

如果您想要这样做,请不要尝试重新发送鼠标监听器调用。你不是老鼠。相反,让鼠标监听器方法只需调用对象上执行实际工作的其他方法。您的鼠标监听器例程应该很简单“如果是这个,则调用这个,如果是那个,则调用那个。”

然后,如果对象之间存在关系,则让其中一个对象接收鼠标监听器单击。然后调用应受该单击影响的所有对象上的方法。

过去,当我将网格放置在另一个 swing 对象内时,我所做的就是创建我自己的监听器模式。然后,当对象 X 发生需要传递给对象 Y 的事情时,我使用监听器模式。这样,每当调用给定方法时需要完成哪些工作就很清楚了。而且它更可重复使用。因此,如果不是鼠标点击而是触发某些内容的菜单,我就不必重复逻辑。

抱歉,如果不是很清楚。

关于java - 监听器调用另一个监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811653/

相关文章:

Java Swing : Can't show several instances of my JPanel

c++ - 如何从 C++ 监听 Lua 中的特定函数调用?

java - 带条件替换的正则表达式

java - 单个 Logger 的每个 appender 的日志级别

java - Java 的 Google Finance 样式控件?

java - 如何获取计时器(Util 或 Swing)以允许我调用 Netbeans 桌面应用程序中的方法?

android - 如何从服务中检测 youtube 的 MediaPlayer 事件

java - 在 radioButtonActionPerfomed 中注册 JPanel

java - 我如何在java中对这个方法进行单元测试?

java - 如何在Android键盘上显示换行按钮?