2015-12-14 2 views
0

Я пишу простую программу рисования с Java. Как и все приложения для красок, есть кнопки для brushTool, sprayTool, sprayTool ... У этих инструментов есть свой класс, который распространяется на MouseAdapter. Они работают так, как должны. Однако проблема начинается, когда я выбираю инструмент после выбора другого инструмента, обе кнопки и их ActionListeners продолжают выполняться, и они выполняют то, что они пишут одновременно. Я имею в виду, если я выберу lineTool (который рисует прямую линию) с помощью rectangleTool I hava диагональ тоже. вот пример моей двух кнопок. То, что я пытаюсь сделать, это остановить текущее действие, когда я нажимаю другую кнопку. Можете ли вы, ребята, помочь мнеКак избежать работы двух JButton в то же время

+0

Отметьте этот ответ Roman. http://stackoverflow.com/a/2628049/5678375 –

ответ

4

Вы не можете продолжать добавлять MouseListener в область рисования каждый раз, когда вы нажимаете кнопку.

Вместо этого вам необходимо отслеживать текущий MouseListener. Затем при нажатии на кнопку необходимо:

  1. удалить текущий MouseListener
  2. добавить новый MouseListener
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

В настоящее время вы связываете слушателей с 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; 
}