我是這個網站的新手,也是一位Java編程新手。我有一個任務,我正在努力。我被要求創建一個簡單的繪圖程序,如Windows Paint。該程序需要有四個JRadioButtonMenuItem(鉛筆,線條,矩形,橢圓),當其中一個被選中時,用戶可以使用分配給單選按鈕的工具進行繪製。我能夠使這些工具與switch語句一起工作。但是,我的講師要求我們不要使用if/else或switch語句。相反,我需要實現一個類層次來處理這些工具。我對從哪裏開始感到困惑,尤其是類層次結構部分。如果有人能給我建議從哪裏開始,這將是很好的。謝謝!Java GUI和模型問題
回答
用抽象draw
方法創建一個基類,並從中派生出四個工具。然後爲每個工具實施該方法。然後每個工具都會知道如何處理繪圖。
但如何將工具分配給每個單選按鈕而不使用if/else或switch?謝謝 – Ming
我沒有看到if/else的需求,或者在這裏切換,基本上只是爲使用相應工具的每個按鈕創建一個ActionListerner。 –
@FrankPuffer OP沒有4個按鈕,他有4個單選按鈕。 – user3437460
我有一個和Frank Puffer相似的想法。在繪圖時確定動作時消除if
和switch
的使用。我們可以使用抽象與重寫:
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)會添加一個MouseListener
和MouseMotionListener
。
當用戶在你的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)
}
- 1. Java GUI問題
- 2. Java GUI問題?
- 3. Java GUI問題
- 4. Java Swing GUI - 問題
- 5. Java GUI的問題
- 6. GUI Loop問題Java
- 7. Java GUI Swing模型說明
- 8. JTextField和RMI的GUI問題Java
- 9. 關於Java的GUI問題
- 10. Java Swing GUI對齊問題
- 11. Java GUI設計的問題
- 12. Java GUI +服務器問題
- 13. java gui圖形問題
- 14. MVVM視圖模型和模型問題
- 15. Sql連接和GUI問題
- 16. 關於Java內存模型的問題
- 17. 有關在java中的GUI的問題
- 18. Java GUI實現中的問題
- 19. Java Applet組件的GUI問題
- 20. Java GUI功能 - 子類問題?
- 21. 在java中的簡單GUI問題
- 22. Java線程問題 - 更新GUI
- 23. Java Swing GUI組合框問題
- 24. 基本Java問題,類更新GUI
- 25. Java泛型問題
- 26. Java泛型問題
- 27. Java泛型問題
- 28. Java泛型問題
- 29. Java泛型問題
- 30. JAVA-與JTable和模型奇怪的問題(可能線程問題)
您首先繼續詢問您的教師尋求幫助,然後在您遇到特定編程問題後發帖。請參閱[本幫助指南](http://stackoverflow.com/help/how-to-ask)如何提出問題以及[本FAQ](http://stackoverflow.com/help/on-主題)以查看主題上的內容。 – CubeJockey
複製Paint看起來不像一個新手項目。聽起來更像是一個Java高級項目。 –
@明看看我的解決方案。 – user3437460