[英]Java graphics drawing doesn't show up on drawing panel
我正在啟動一個非常簡單的Java程序。 用戶可以從菜單中選擇形狀,大小,填充(布爾值),lineColor和fillColor,然后單擊並拖動以在屏幕上繪制所選對象。 在這一點上,我只是想弄清楚為什么屏幕上什么都沒畫。 在run方法中,我有一個以200,200繪制的簡單矩形,但是面板上沒有任何顯示。 我確信一旦弄清為什么什么都沒畫出來,我就可以使程序的其余部分正常工作,知道我做錯了什么嗎?
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){}
}
在AWT應用程序中,每當要繪制時,通常都會創建Canvas
的子類來覆蓋paint(Graphics)方法。 有關示例,請參見Java AWT Canvas –自由繪圖 。
不幸的是,您當前的方法不起作用的原因非常復雜。 例如,所有繪制都必須在事件分發線程 (也稱為AWT線程)上完成。 AWT為您創建了這些特殊線程,並且在大多數情況下,您無需擔心,除非創建自己的線程。 而且,正如MadProgrammer指出的那樣,您不應該保留Graphics
引用。 在該方法期間,您僅應使用AWT提供的Graphics
參考。 一個例外是從BufferedImage
獲得的Graphics
引用(所謂的軟件圖形上下文)。
Graphics
上下文的引用。 Graphics
上下文是無狀態的(也就是說,在繪制周期之間重置了狀態), Graphics
上下文也可能在繪制周期之間更改,從而使您擁有無效的上下文。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.