2016-02-19 86 views
0

我是這個網站的新手,也是一位Java編程新手。我有一個任務,我正在努力。我被要求創建一個簡單的繪圖程序,如Windows Paint。該程序需要有四個JRadioButtonMenuItem(鉛筆,線條,矩形,橢圓),當其中一個被選中時,用戶可以使用分配給單選按鈕的工具進行繪製。我能夠使這些工具與switch語句一起工作。但是,我的講師要求我們不要使用if/else或switch語句。相反,我需要實現一個類層次來處理這些工具。我對從哪裏開始感到困惑,尤其是類層次結構部分。如果有人能給我建議從哪裏開始,這將是很好的。謝謝!Java GUI和模型問題

+4

您首先繼續詢問您的教師尋求幫助,然後在您遇到特定編程問題後發帖。請參閱[本幫助指南](http://stackoverflow.com/help/how-to-ask)如何提出問題以及[本FAQ](http://stackoverflow.com/help/on-主題)以查看主題上的內容。 – CubeJockey

+0

複製Paint看起來不像一個新手項目。聽起來更像是一個Java高級項目。 –

+0

@明看看我的解決方案。 – user3437460

回答

1

用抽象draw方法創建一個基類,並從中派生出四個工具。然後爲每個工具實施該方法。然後每個工具都會知道如何處理繪圖。

+0

但如何將工具分配給每個單選按鈕而不使用if/else或switch?謝謝 – Ming

+0

我沒有看到if/else的需求,或者在這裏切換,基本上只是爲使用相應工具的每個按鈕創建一個ActionListerner。 –

+0

@FrankPuffer OP沒有4個按鈕,他有4個單選按鈕。 – user3437460

0

我有一個和Frank Puffer相似的想法。在繪圖時確定動作時消除ifswitch的使用。我們可以使用抽象與重寫:

abstract class Tool{ 
    public abstract void draw(); 
} 

但是,每個繪圖操作不會通過單擊觸發。它由一系列的多個來自鼠標的動作例如鼠標向下,鼠標向上,鼠標拖動。

abstract class Tool implements MouseListener, MouseMotionListener{ 

} 

注::以上都不可能是一個接口,以及因此,代替具有單個draw()方法,我們將如下改變抽象工具類。

現在我們可以實現的子類:

class PencilTool extends Tool{ 
    //With all the overridden methods 
}  
class LineTool extends Tool{ 
    //With all the overridden methods 
} 
class RectangleTool extends Tool{ 
    //With all the overridden methods 
}  
class EllipseTool extends Tool{ 
    //With all the overridden methods 
} 

在你paintApp,可以維持當前選中的工具的一個實例。當用戶單擊四個單選按鈕之一(鉛筆,直線,矩形,橢圓)時更新當前工具實例。

class PaintApp 
{ 
    private Tool currentTool; 
    private JRadioButton rdbPencil, rdbLine, rdbRectangle, rdbEllipse; 
    private DrawingSpace drawingSpace; //See below for details 

    //constructors and other initializations not shown.. 

    public void init(){ 
     //adding of buttonGroup for radio buttons not shown.. 
     rdbPencil = new JRadioButton(); 
     rdbPencil.addItemListener(new ItemListener(){ 
      @Override 
      public void itemStateChanged(ItemEvent e){ 
       //if rdbPencil was selected, set currentTool as pencilTool 
       currentTool = new PencilTool(); 
      } 
     }); 

     rdbLine = new JRadioButton(); 
     rdbLine.addItemListener(new ItemListener(){ 
      @Override 
      public void itemStateChanged(ItemEvent e){ 
       //if rdbLine was selected, set currentTool as lineTool 
       currentTool = new LineTool(); 
      } 
     }); 
    } 
    //continue to init other tools (rectangle and ellipse) 
} 

所以,現在,無論何時用戶選擇一個單選按鈕,currentTool將相應地更新。最後一步是將實際的鼠標操作與工具的操作關聯起來。

如果您正在JPanel上繪圖。很可能您的drawingSpace(JPanel)會添加一個MouseListenerMouseMotionListener

當用戶在你的drawingSpace觸發鼠標操作,讓你的當前工具分別處理措施:

class DrawingSpace extends JPanel implement MouseListener, MouseMotionListener 
{ 
    //Other potential variables and initializations not shown.. 

    public DrawingSpace(){ 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 

    //let the currentTool handle the events 
    @Override public void mousePressed(MouseEvent e){ 
     currentTool.mousePressed(e); 
    } 
    @Override public void mouseReleased(MouseEvent e){ 
     currentTool.mouseReleased(e); 
    } 
    @Override public void mouseDragged(MouseEvent e){ 
     currentTool.mouseDragged(e); 
    } 

    //Other overridden methods not shown 
} 

最後,記住所有我們創建剛纔工具子?我們只需要告訴他們當不同的工具觸發各種鼠標活動時應該怎麼做。

//EXAMPLE: 
class PencilTool extends Tool{ 

    @Override public void mousePressed(MouseEvent e){ 
     //Based on e.getX() & e.getY() 
     //Draw on JPanel (or onto a BufferedImage)   
    } 
    //Other overridden methods not shown (those not in use will be empty) 
}  

class LineTool extends Tool{ 
    @Override public void mousePressed(MouseEvent e){ 
     //Get point 1 from e.getX() & e.getY()   
    } 
    @Override public void mouseReleased(MouseEvent e){ 
     //Save drawing to buffer (a BufferedImage, if you have one) 
    } 
    @Override public void mouseDragged(MouseEvent e){ 
     //Get point 2 from e.getX() & e.get() 
     //Draw a line from pt1 to pt2 
     //repaint(); 
    } 
    //Other overridden methods not shown (those not in use will be empty) 
}