2014-10-31 35 views
0

我在我的程序中有一個組合框,有三個選項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();      
        } 
       });  
      }      

     } 
+0

正如您在[上一個問題](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

回答

1

最簡單的解決辦法是將存儲最後監聽器和添加新的人之前刪除:選擇在每次做出

  private MouseListener lastListener; 
      // ... 

      JComboBox cb = (JComboBox)e.getSource(); 

      if (cb.getSelectedItem().equals("Rectangle")) {   
      if (lastListener != null) 
       contentPane.removeMouseListener(lastListener); 
      lastListener = new MouseAdapter() {  //First mouseListener  
       // ... 
      }; 
      contentPane.addMouseListener(lastListener); 
+0

什麼是「lastListener」?我如何申報?感謝您的幫助 – user2939293 2014-10-31 23:23:44

+0

除了您已經定義的方法以外,它只是您應該在類中聲明的一個屬性。 – Yogu 2014-10-31 23:24:43

+0

謝謝你,你是我的英雄。奇蹟般有效! – user2939293 2014-10-31 23:46:27

2

取而代之的將不同的監聽器面板組合框中,您應該在構造函數中向面板添加一個鼠標偵聽器。當這個監聽器調用其中一個方法時,應該首先檢查選擇了哪個選項,並相應地採取行動(即根據選擇繪製一個矩形,一個圓形或空閒手)。