2012-12-09 187 views
1

我開始一個非常簡單的java程序。用戶可以從菜單中選擇形狀,大小,填充(布爾),lineColor和fillColor,然後單擊並拖動以在屏幕上繪製選定的對象。在這一點上,我只是想弄清楚爲什麼沒有畫在屏幕上。在run方法中,我有一個以200,200繪製的簡單矩形,但面板上沒有任何東西出現。我相信,我可以讓程序的其餘部分工作得很好,一旦我找出爲什麼沒有繪畫任何想法我做錯了什麼?Java圖形繪製不顯示在繪圖面板上

import java.awt.*; 
import java.applet.*; 
import java.awt.event.*; 
import java.util.*; 
import java.io.*; 
import java.lang.*; 
import java.awt.Rectangle; 

public class E3G04 extends Frame implements WindowListener, ActionListener, ItemListener, MouseListener, MouseMotionListener, Runnable 
{ 
    volatile String type = "rectangle"; 
    volatile Boolean fill = true; 
    Color lineColor = Color.BLACK; 
    Color fillColor = Color.BLACK; 
    int size = 1; 

    private Graphics obj; 
    Point start = new Point(100,100); 
    Point cur = new Point(100,100); 
    Point end = new Point(100,100); 

    Panel drawingpanel; 
    Thread thread = new Thread(this); 
    boolean running = true; 

    MenuBar mb = new MenuBar(); 
     Menu fileMenu = new Menu("File"); 
      MenuItem newItem = new MenuItem("New (Ctrl-N)"); 
      MenuItem quitItem = new MenuItem ("Quit (Ctrl-Q)"); 
     Menu drawMenu = new Menu("Draw"); 
      Menu typeMenu = new Menu("Type"); 
       CheckboxMenuItem ovalItem = new CheckboxMenuItem("Oval (Ctrl-O)"); 
       CheckboxMenuItem rectItem = new CheckboxMenuItem("Rectangle (Ctrl-R)", true); 
       CheckboxMenuItem lineItem = new CheckboxMenuItem("Line (Ctrl-L)"); 
      Menu fillMenu = new Menu ("Fill"); 
       CheckboxMenuItem fillItem = new CheckboxMenuItem("Fill", true); 
       CheckboxMenuItem noFillItem = new CheckboxMenuItem("No Fill"); 
      Menu colorMenu = new Menu ("Color"); 
       CheckboxMenuItem blackLineItem = new CheckboxMenuItem("Black Line", true); 
       CheckboxMenuItem redLineItem = new CheckboxMenuItem("Red Line"); 
       CheckboxMenuItem orangeLineItem = new CheckboxMenuItem("Orange Line"); 
       CheckboxMenuItem yellowLineItem = new CheckboxMenuItem("Yellow Line"); 
       CheckboxMenuItem greenLineItem = new CheckboxMenuItem("Green Line"); 
       CheckboxMenuItem blueLineItem = new CheckboxMenuItem("Blue Line"); 
       CheckboxMenuItem purpleLineItem = new CheckboxMenuItem("Purple Line"); 
       CheckboxMenuItem grayLineItem = new CheckboxMenuItem("Gray Line"); 
       CheckboxMenuItem blackFillItem = new CheckboxMenuItem("Black Fill", true); 
       CheckboxMenuItem redFillItem = new CheckboxMenuItem("Red Fill"); 
       CheckboxMenuItem orangeFillItem = new CheckboxMenuItem("Orange Fill"); 
       CheckboxMenuItem yellowFillItem = new CheckboxMenuItem("Yellow Fill"); 
       CheckboxMenuItem greenFillItem = new CheckboxMenuItem("Green Fill"); 
       CheckboxMenuItem blueFillItem = new CheckboxMenuItem("Blue Fill"); 
       CheckboxMenuItem purpleFillItem = new CheckboxMenuItem("Purple Fill"); 
       CheckboxMenuItem grayFillItem = new CheckboxMenuItem("Gray Fill"); 
      Menu sizeMenu = new Menu("Size"); 
       CheckboxMenuItem oneItem = new CheckboxMenuItem("One", true); 
       CheckboxMenuItem twoItem = new CheckboxMenuItem("Two"); 
       CheckboxMenuItem threeItem = new CheckboxMenuItem("Three"); 
       CheckboxMenuItem fourItem = new CheckboxMenuItem("Four"); 
       CheckboxMenuItem fiveItem = new CheckboxMenuItem("Five"); 

    protected E3G04() 
    { 

     // Add everything to the menu bar and then 
     // add the menu bar to the frame 
     mb.add(fileMenu); 
     mb.add(drawMenu); 
     fileMenu.add(newItem); 
     fileMenu.add(quitItem); 
     drawMenu.add(typeMenu); 
     drawMenu.add(fillMenu); 
     drawMenu.add(colorMenu); 
     drawMenu.add(sizeMenu); 
     typeMenu.add(ovalItem); 
     typeMenu.add(rectItem); 
     typeMenu.add(lineItem); 
     fillMenu.add(fillItem); 
     fillMenu.add(noFillItem); 
     if (fill && type != "line") 
     {  
      enableAllColors(); 
     } 
     else 
     { 
      disableFillColor(); 
     } 
     sizeMenu.add(oneItem); 
     sizeMenu.add(twoItem); 
     sizeMenu.add(threeItem); 
     sizeMenu.add(fourItem); 
     sizeMenu.add(fiveItem);     
     setMenuBar(mb); 

     //Set all of the listeners 
     newItem.addActionListener(this); 
     quitItem.addActionListener(this); 
     ovalItem.addItemListener(this); 
     rectItem.addItemListener(this); 
     lineItem.addItemListener(this); 
     fillItem.addItemListener(this); 
     noFillItem.addItemListener(this); 
     blackLineItem.addItemListener(this); 
     redLineItem.addItemListener(this);   
     orangeLineItem.addItemListener(this); 
     yellowLineItem.addItemListener(this); 
     greenLineItem.addItemListener(this); 
     blueLineItem.addItemListener(this); 
     purpleLineItem.addItemListener(this); 
     grayLineItem.addItemListener(this); 
     oneItem.addItemListener(this); 
     twoItem.addItemListener(this); 
     threeItem.addItemListener(this); 
     fourItem.addItemListener(this); 
     fiveItem.addItemListener(this);  

     drawingpanel = new Panel(); 
     drawingpanel.setLayout(null); 
     drawingpanel.setSize(800,600); 
     drawingpanel.addMouseListener(this); 
     drawingpanel.addMouseMotionListener(this); 
     setBounds(100,100,800,600); 
     setLayout(new BorderLayout()); 

     add("Center",drawingpanel); 
     addWindowListener(this); 
     setResizable(true); 
     pack(); 
     setVisible(true); 
     thread.start(); 
    } 

    public static void main(String [] args) 
    { 
     new E3G04(); 
    } 
    public void run() 
    {  
     obj = getGraphics(); 
     System.out.print("here"); 
     obj.setColor(Color.black); 
     obj.drawRect(200,200,100,100); 
     obj.fillRect(200,200,100,100); 
     while(running) 
     {   
      //other stuff to come 
     } 
    } 

    public void stop() 
    { 
     drawingpanel.removeMouseListener(this); 
     newItem.removeActionListener(this); 
     quitItem.removeActionListener(this); 
     ovalItem.removeItemListener(this); 
     rectItem.removeItemListener(this); 
     lineItem.removeItemListener(this); 
     fillItem.removeItemListener(this); 
     noFillItem.removeItemListener(this); 
     blackLineItem.removeItemListener(this); 
     redLineItem.removeItemListener(this);   
     orangeLineItem.removeItemListener(this); 
     yellowLineItem.removeItemListener(this); 
     greenLineItem.removeItemListener(this); 
     blueLineItem.removeItemListener(this); 
     purpleLineItem.removeItemListener(this); 
     grayLineItem.removeItemListener(this); 
     oneItem.removeItemListener(this); 
     twoItem.removeItemListener(this); 
     threeItem.removeItemListener(this); 
     fourItem.removeItemListener(this); 
     fiveItem.removeItemListener(this); 
     dispose(); 
     System.exit(0); 
    } 

    public void disableFillColor() 
    { 
     colorMenu.removeAll(); 
     colorMenu.add(blackLineItem); 
     colorMenu.add(redLineItem); 
     colorMenu.add(orangeLineItem); 
     colorMenu.add(yellowLineItem); 
     colorMenu.add(greenLineItem); 
     colorMenu.add(blueLineItem); 
     colorMenu.add(purpleLineItem); 
     colorMenu.add(grayLineItem); 
    } 
    public void enableAllColors() 
    { 
     colorMenu.removeAll(); 
     colorMenu.add(blackLineItem); 
     colorMenu.add(redLineItem); 
     colorMenu.add(orangeLineItem); 
     colorMenu.add(yellowLineItem); 
     colorMenu.add(greenLineItem); 
     colorMenu.add(blueLineItem); 
     colorMenu.add(purpleLineItem); 
     colorMenu.add(grayLineItem);   
     colorMenu.addSeparator(); 
     colorMenu.add(blackFillItem); 
     colorMenu.add(redFillItem); 
     colorMenu.add(orangeFillItem); 
     colorMenu.add(yellowFillItem); 
     colorMenu.add(greenFillItem); 
     colorMenu.add(blueFillItem); 
     colorMenu.add(purpleFillItem); 
     colorMenu.add(grayFillItem); 
    } 
    public void actionPerformed(ActionEvent e) 
    { 
     Object o = e.getSource(); 

     if (o == newItem) 
     { 
      //Clear Screen 
     } 

     if (o == quitItem) 
     { 
      thread.stop(); 
      running = false; 
      stop(); 
     } 
    }  

    public void mouseClicked(MouseEvent m) 
    { 
     Object o = m.getSource(); 
    } 

    public void mousePressed(MouseEvent m) 
    { 
     start = m.getPoint(); 
     end = start; 
     cur = start; 
    } 

    public void mouseDragged(MouseEvent m) 
    { 
     cur = m.getPoint(); 
    } 

    public void mouseReleased(MouseEvent m) 
    { 
     end = cur; 
    } 

    public void itemStateChanged(ItemEvent e) 
    { 
     //Code removed for brevity 
    } 
    public void windowClosing(WindowEvent e) 
    { 
     running = false; 
     stop(); 
    } 
    public void mouseExited(MouseEvent m) 
    {} 
    public void mouseEntered(MouseEvent m) 
    {} 
    public void mouseMoved(MouseEvent m) 
    { } 
    public void windowClosed(WindowEvent e){} 
    public void windowOpened(WindowEvent e){} 
    public void windowActivated(WindowEvent e){} 
    public void windowDeactivated(WindowEvent e){} 
    public void windowIconified(WindowEvent e){} 
    public void windowDeiconified(WindowEvent e){} 
} 
+0

爲什麼使用'Thread'?爲什麼要維護對'Graphics'上下文的引用?你爲什麼使用AWT? – MadProgrammer

+0

嗯,我正在使用一個線程,以便(最終)我可以使用MouseListener在屏幕上繪製更多形狀。如果我不使用線程,運行中的循環會不會阻止我與框架交互?至於保持對Graphics上下文的引用,我不確定我是否明白你的意思。而使用AWT,這僅僅是因爲我寫這個作爲期末考試的練習(其中包括AWT),所以揮杆不會有幫助。 –

+1

AWT在它自己的'Thread'中運行,即所謂的Event Dispatching Thread。像Swing一樣,AWT是一個事件驅動的環境,你不需要像許多其他語言那樣的「主循環」。只需運行程序並回應事件 – MadProgrammer

回答

4

在AWT應用程序,只要你想得出,你通常創建的Canvas一個子類重寫paint(Graphics)方法。一個例子見Java AWT Canvas – Freelance Drawing

爲什麼你目前的做法是不工作的原因是不幸的是非常複雜的。例如,所有繪圖必須在event dispatch thread(也稱爲AWT線程)上完成。 AWT爲您創建了這些特殊線程,大多數情況下,除了創建自己的線程時,您不必擔心它。另外,正如MadProgrammer指出的,你不應該堅持Graphics引用。您應該只使用在AWT期間提供給您的Graphics引用。對此的一個例外是從BufferedImages(所謂的軟件圖形上下文)獲得的Graphics參考。

+0

感謝您的迴應!不幸的是,我的這個聯繫被打破了。 編輯:它剛剛出現 –

1
  1. 決不保持到Graphics上下文的引用。 Graphics上下文是無狀態的(也就是說,它的狀態在繪製週期之間重置),上下文在繪製週期之間也可能發生變化,從而導致無效上下文。