我在我的程序中有一個組合框,有三個選項CIRCLE,RECTANGLE,FREEHAND。每個選項都連接到一個mouselistener。如果我在三個選項之間切換,mouselisteners會給我帶來一些問題。因此,我只想添加一個mouselistener(例如在構造函數或方法的開頭或其他地方)。它甚至可能,代碼將如何? 如果這是不可能的,有什麼其他方式可以解決嗎?Java只有addMouseListener一次
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(comboBox)) {
JComboBox cb = (JComboBox)e.getSource();
if (cb.getSelectedItem().equals("Rectangle")) {
contentPane.addMouseListener(new MouseAdapter() { //First mouseListener
@Override
public void mousePressed(MouseEvent e) {
startX = e.getX();
startY = e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
endX = e.getX();
endY = e.getY();
int width = startX - endX;
int height = startY - endY;
w = Math.abs(width);
h = Math.abs(height);
Rectangle r = new Rectangle(startX, startY, w, h, pickedColor, thickness);
shapeList.add(r);
repaint();
}
});
}
else if (cb.getSelectedItem().equals("Circle")) {
contentPane.addMouseListener(new MouseAdapter() { //Second
@Override
public void mousePressed(MouseEvent e) {
startX = e.getX();
startY = e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
endX = e.getX();
endY = e.getY();
int width = startX - endX;
int height = startY - endY;
w = Math.abs(width);
h = Math.abs(height);
Circle c = new Circle(startX, startY, w, h, pickedColor, thickness);
shapeList.add(c);
repaint();
}
});
}
else if (cb.getSelectedItem().equals("Freehand")) {
contentPane.addMouseListener(new MouseAdapter() { //Third
@Override
public void mousePressed(MouseEvent e) {
startX = e.getX();
startY = e.getY();
}
@Override
public void mouseDragged(MouseEvent e) {
FreeHand fh = new FreeHand(startX, startY, e.getX(), e.getY(), pickedColor, thickness);
shapeList.add(fh);
repaint();
}
});
}
}
正如您在[上一個問題](http://stackoverflow.com/questions/26662768/how-to-get-rid-of-circle-inside-rectangle-when-switching-between-objects)中所述,您應該添加一個SINGLE'MouseListener',可能在構造函數中,它有能力知道如何處理當前選擇的形狀。這可以通過使用某種工廠來實現,但在你準備好之前可能會使問題變得複雜...... – MadProgrammer 2014-11-01 00:52:47