如何避免同时使用两个JButton

时间:2015-12-14 15:48:46

标签: java swing actionlistener mouselistener

我正在用Java编写一个简单的绘图程序。由于所有的涂料应用都有brushTool,sprayTool,sprayTool等按钮......这个工具有自己的类,可以扩展到MouseAdapter。他们正在按照自己的意愿工作。但是,当我选择另一个工具后选择一个工具时,问题就开始了,两个按钮和它们的ActionListener都在继续执行,并且它们同时执行它们所写的内容。我的意思是如果我选择lineTool(绘制直线)与rectangleTool我也有一个对角线。这是我的两个按钮的例子。我要做的是当我点击另一个按钮时停止当前操作。你能帮助我吗

{{1}}

3 个答案:

答案 0 :(得分:4)

每次单击按钮时,都无法继续将MouseListener添加到绘图区域。

相反,您需要跟踪当前的MouseListener。然后当您单击按钮时,您需要:

  1. 删除当前的MouseListener
  2. 添加新的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;
        }
    });

状态可以是整数,BRUSHLINE是常数,例如0和1。

然后在监听器(对于mainDrawArea)中,检查当前状态

switch (state){
    case BRUSH: //trigger action needed for brushing;
               break;
    case LINE: //trigger action needed for drawing line;
               break;
}