[英]Using same MouseListener event for multiple actions, drawing in java swing
一般来说,我仍在学习 java,所以我可以使用一些帮助。 我创建了一个弹出菜单,当我在面板上单击鼠标左键时会打开它。 弹出菜单使用 MouseListener 读取需要打开的坐标。 现在我想在打开弹出菜单的地方使用相同的 x 和 y 来绘制我从该位置的菜单中选择的形状(如果形状是一个点,它应该在菜单打开的地方绘制,如果我选择一条线的话,线的起点将在该位置)。 这是到目前为止的代码:
public class PnlDrawing extends JPanel {
public ArrayList<Shape> shapes = new ArrayList<Shape>();
public PnlDrawing() {
setSize(800,600);
}
public static void main(String[] args) {
JFrame frame = new JFrame("PnlDrawing");
frame.setSize(800, 600);
PnlDrawing drawing = new PnlDrawing();
frame.getContentPane().add(drawing);
frame.setVisible(true);
final JMenu subPopup = new JMenu("Add");
final JMenuItem popPoint = new JMenuItem("Point");
popPoint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
final JMenuItem popLine = new JMenuItem("Line");
popLine.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
final JMenuItem popCircle = new JMenuItem("Circle");
popCircle.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
final JMenuItem popDonut = new JMenuItem("Donut");
popDonut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
final JMenuItem popRectangle = new JMenuItem("Rectangle");
popRectangle.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
final JMenuItem popMod = new JMenuItem("Modify");
popMod.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
final JMenuItem popRemove = new JMenuItem("Remove");
popRemove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
frame.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
JPopupMenu mainPopup = new JPopupMenu();
subPopup.add(popPoint);
subPopup.add(popLine);
subPopup.add(popCircle);
subPopup.add(popDonut);
subPopup.add(popRectangle);
mainPopup.add(subPopup);
mainPopup.addSeparator();
mainPopup.add(popMod);
mainPopup.add(popRemove);
mainPopup.show(e.getComponent(), e.getX(), e.getY());
}
}
});
}
@Override
public void paint(Graphics g) {
for (int i = 0; i < shapes.size(); i++)
{
shapes.get(i).draw(g);
}
}
}
我已经为每个形状和绘制方法实现了类。 我只需要将这个菜单与绘图和鼠标 position 连接起来,这样当我单击 Add -> Point 时它就会出现在面板上。 如果你有任何其他方式来做这一切,我很乐意听到。
您的所有代码都不应该包含在 main() 方法中。 main() 方法应该做的就是创建框架并将“DrawingPanel”的一个实例添加到框架中。 为您的课程使用描述性名称。 没有理由使用“Pnl”作为缩写。
main() 方法中逻辑的所有 rest 应移动到绘图面板 class。
自定义绘画是通过覆盖 DrawingPanel class 的 paintComponent(...) 方法来完成的。 阅读 Swing 教程中关于自定义绘画的部分,以获取帮助您入门的工作示例。 使用教程示例作为起点,因为它将为您的代码演示更好的结构,因此所有组件都在Event Dispatch Thread (EDT)
上创建。
当使用右键单击时,通常会显示一个弹出菜单。 阅读有关启动弹出菜单的教程部分。
不要每次都在 MouseListener 中重新创建弹出菜单。 在 class 的构造函数中创建弹出窗口,并在必要时显示它。
现在我想使用相同的 x 和 y 打开弹出菜单来绘制形状
在 class 中创建一个实例变量,如“mousePressed”。 然后是鼠标侦听器的 mousePressed 事件,您可以更新“mousePressed”变量以反映鼠标 position。 然后,在将 Shape 添加到列表时,您的所有 ActionListener 都将引用此变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.