对多个动作使用相同的MouseListener事件,在JavaSwing中绘制
我还在学习java的过程中,所以我需要一些帮助。 我已经创建了一个弹出菜单,当我左键单击面板时打开。弹出菜单使用MouseListener读取需要打开的坐标。 现在,我想在弹出菜单打开的位置使用相同的x和y来绘制我从该位置的菜单中选择的形状(如果形状是一个点,它应该在菜单打开的位置绘制,如果我选择一条线,那么线的起点将在该位置)。以下是迄今为止的代码:对多个动作使用相同的MouseListener事件,在JavaSwing中绘制,java,swing,draw,mouselistener,Java,Swing,Draw,Mouselistener,我还在学习java的过程中,所以我需要一些帮助。 我已经创建了一个弹出菜单,当我左键单击面板时打开。弹出菜单使用MouseListener读取需要打开的坐标。 现在,我想在弹出菜单打开的位置使用相同的x和y来绘制我从该位置的菜单中选择的形状(如果形状是一个点,它应该在菜单打开的位置绘制,如果我选择一条线,那么线的起点将在该位置)。以下是迄今为止的代码: public class PnlDrawing extends JPanel { public ArrayList<Shape> s
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);
}
}
公共类PnlDrawing扩展了JPanel{
public ArrayList shapes=new ArrayList();
公共PnlDrawing(){
设置大小(800600);
}
公共静态void main(字符串[]args){
JFrame=新JFrame(“PnlDrawing”);
框架设置尺寸(800600);
PnlDrawing drawing=新的PnlDrawing();
frame.getContentPane().add(绘图);
frame.setVisible(true);
最终JMenu子菜单=新JMenu(“添加”);
最终JMenuItem popPoint=新JMenuItem(“点”);
addActionListener(新ActionListener()){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem popLine=新JMenuItem(“行”);
addActionListener(新ActionListener()){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem popCircle=新JMenuItem(“圆”);
addActionListener(新的ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem炸面圈=新的JMenuItem(“炸面圈”);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
final JMenuItem popRectangle=新JMenuItem(“矩形”);
addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem popMod=新JMenuItem(“修改”);
popMod.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
最终JMenuItem popRemove=新JMenuItem(“Remove”);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
frame.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效MouseEvent(MouseEvent e){
if(SwingUtilities.isLeftMouseButton(e)){
JPopupMenu mainpoop=新的JPopupMenu();
子项添加(popPoint);
子项添加(popLine);
子项添加(popCircle);
子产品添加(炸面圈);
子种群添加(popRectangle);
主弹出窗口。添加(子弹出窗口);
mainpoop.addSeparator();
mainpoop.add(popMod);
mainpoop.add(popRemove);
show(e.getComponent(),e.getX(),e.getY());
}
}
});
}
@凌驾
公共空间涂料(图g){
对于(int i=0;i
}
我已经为每个shape和draw方法实现了类。我只需要将此菜单与绘图和鼠标位置连接起来,这样当我单击“添加->点”时,它就会显示在面板上。
如果你有其他的方法来做这一切,我很乐意听你这么说
事件调度线程(EDT)
上创建的