Я пишу простую программу рисования с Java. Как и все приложения для красок, есть кнопки для brushTool, sprayTool, sprayTool ... У этих инструментов есть свой класс, который распространяется на MouseAdapter. Они работают так, как должны. Однако проблема начинается, когда я выбираю инструмент после выбора другого инструмента, обе кнопки и их ActionListeners продолжают выполняться, и они выполняют то, что они пишут одновременно. Я имею в виду, если я выберу lineTool (который рисует прямую линию) с помощью rectangleTool I hava диагональ тоже. вот пример моей двух кнопок. То, что я пытаюсь сделать, это остановить текущее действие, когда я нажимаю другую кнопку. Можете ли вы, ребята, помочь мнеКак избежать работы двух JButton в то же время
ответ
Вы не можете продолжать добавлять MouseListener в область рисования каждый раз, когда вы нажимаете кнопку.
Вместо этого вам необходимо отслеживать текущий MouseListener. Затем при нажатии на кнопку необходимо:
- удалить текущий MouseListener
- добавить новый MouseListener
Я хотел бы заменить слушателя кнопку действия для набора Тумблеры Кнопки в группе
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;
}
}
}
В настоящее время вы связываете слушателей с 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;
}
Отметьте этот ответ Roman. http://stackoverflow.com/a/2628049/5678375 –