[英]Listener invokes another 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;
}
}
如果您正在尝试这样做,请不要尝试重新发送鼠标监听器调用。 你不是老鼠。 相反,让鼠标侦听器方法只需调用对象上执行实际工作的其他方法。 您的鼠标监听器例程应该是微不足道的“如果是这样,请调用它,如果是这样,请调用它。”
然后,如果对象之间存在关系,请让其中一个接收鼠标侦听器单击。 然后在应该受该单击影响的所有对象上调用方法。
过去,将网格放置在另一个摆动对象中时,我所做的就是创建自己的侦听器模式。 然后,当对象X发生需要传递给对象Y的事情时,我使用我的侦听器模式。 这样,很明显每当调用给定方法时都需要完成哪些工作。 它更可重复使用。 因此,如果它不是鼠标点击而是触发某事的菜单,我不必复制逻辑。
对不起,如果不是很清楚。
您可以随时向前如图所示,从一个组件到另一个活动在这里 ; 和Action
是封装菜单和组件共享行为的首选方法。
在这种情况下,您似乎想要自己进行绘图和鼠标处理。 您可能想研究这个简单的GraphPanel
,它依赖于常见的侦听器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.