我正在用Java编写一个简单的绘图程序。由于所有的涂料应用都有brushTool,sprayTool,sprayTool等按钮......这个工具有自己的类,可以扩展到MouseAdapter。他们正在按照自己的意愿工作。但是,当我选择另一个工具后选择一个工具时,问题就开始了,两个按钮和它们的ActionListener都在继续执行,并且它们同时执行它们所写的内容。我的意思是如果我选择lineTool(绘制直线)与rectangleTool我也有一个对角线。这是我的两个按钮的例子。我要做的是当我点击另一个按钮时停止当前操作。你能帮助我吗
{{1}}
答案 0 :(得分:4)
每次单击按钮时,都无法继续将MouseListener添加到绘图区域。
相反,您需要跟踪当前的MouseListener。然后当您单击按钮时,您需要:
答案 1 :(得分:2)
我会为组中的一组切换按钮替换按钮动作侦听器
https://docs.oracle.com/javase/tutorial/uiswing/components/buttongroup.html
然后在一个鼠标监听器中移动所有内容。
public void mousePressed(MouseEvent e) {
this.drawingState = !this.drawingState
if ( isRightCLick(e) ) resetAllPendingOperation();
if (drawingState) {
this.startPoint = getPointFromEvent(e);
switch(toolbarGetCurrentTool()) {
case "line":
registerMouseLineListener(startPoint);//here you draw live preview
break
case "rectangle":
registerMouseRectangleListener(startPoint); //here you draw live preview
break;
}
} else {
//user clicked the second time, commit changes
//same switch as above
this.endPoint = getPointFromEvent(e);
switch(toolbarGetCurrentTool()) {
case "line":
commitLine(startPoint, endpoint);//here you draw live preview
break
case "rectangle":
commitRectangle(startPoint, endpoint); //here you draw live preview
break;
}
}
}
答案 2 :(得分:2)
您当前正在将侦听器绑定到mainDrawArea,而不是为每个单独的按钮设置操作。
请注意,您在 actionPerformed()
中为每个按钮的actionListener编写的代码是您每次单击该按钮时要触发的操作。每次单击按钮时,您都不希望向mainDrawArea添加新的侦听器。
您可以为当前操作创建状态,例如:
brushBotton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
state = BRUSH;
}
});
lineBotton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
state = LINE;
}
});
状态可以是整数,BRUSH
和LINE
是常数,例如0和1。
然后在监听器(对于mainDrawArea)中,检查当前状态
switch (state){
case BRUSH: //trigger action needed for brushing;
break;
case LINE: //trigger action needed for drawing line;
break;
}